Как получить родительский PID данного процесса в GNU / Linux из командной строки?

90

Решено, прежде чем спросил: cat /proc/1111/status | grep PPid

Vi.
источник
быстрее: grep PPid status |cut -f2как в time(for((i=0;i<1000;i++));do grep PPid status |cut -f2 >/dev/null;done); Интересно, есть ли что-то еще быстрее?
Водолей Сила
1
@ AquariusPower Так как вы спрашиваете, fgrep работает быстрее, чем grep. fgrep PPid status |cut -f2
jbo5112
sed гораздо быстрее, чем grep и cut:sed -rn '/PPid/ s/^.*:\s+// p' < status
Marian

Ответы:

108

Командная строка:

ps -o ppid= -p 1111

Функция:

ppid () { ps -p ${1:-$$} -o ppid=; }

Псевдоним (функция предпочтительнее ):

alias ppid='ps -o ppid= -p'

Автор сценария:

#!/bin/sh
pid=$1
if [ -z $pid ]
then
    read -p "PID: " pid
fi
ps -p ${pid:-$$} -o ppid=

Если PID не предоставлен функции или сценарию, они по умолчанию показывают PPID текущего процесса.

Чтобы использовать псевдоним, необходимо указать PID.

Деннис Уильямсон
источник
=Знак не нужен, по крайней мере , на OS X 10.8.2.
Jtbandes
5
@jtbandes: Используемый здесь знак равенства подавляет вывод строки заголовка ( Linux и OS X ).
Деннис Уильямсон
13

Это одна из тех вещей, которые я изучаю, забываю, заново изучаю, повторяю. Но это полезно. Флаг 'p' команды pstree показывает дерево с листом в N:

pstree -sA $(pgrep badblocks)
systemd---sudo---mkfs.ext4---badblocks
user194394
источник
12

Родительский pid находится в переменной оболочки PPID, поэтому

echo $PPID
Иван Новотный
источник
1
Да, но 1. Я хочу родительский pid другого процесса, 2. Я хочу иметь возможность пройти через всех предков в init.
Ви.
1
С другой стороны, использование $PPIDтолько что решило проблему, на которую Google предложил эту страницу в качестве ответа.
Пол Уиттакер,
12

Чтобы напечатать родительские идентификаторы ( PPID) всех процессов, используйте эту команду:

ps j

Для одного процесса, просто передать PID, как: ps j 1234.

Чтобы извлечь только значение, отфильтруйте вывод awk, например:

ps j | awk 'NR>1 {print $3}' # BSD ps
ps j | awk 'NR>1 {print $1}' # GNU ps

Чтобы перечислить PID всех родителей, используйте pstree(установите его, если у вас его нет):

$ pstree -sg 1234
systemd(1)───sshd(1036)───bash(2383)───pstree(3007)

Чтобы получить родительский PID текущего процесса, используйте echo $$.

kenorb
источник
1
pstreeсамый хороший, который я видел здесь.
Судо
ps jвеликолепен, потому что он доступен во многих дистрибутивах и легко компонуется
Коннор Маккормик
6

Чтение / proc / $ PID / статус. Может быть легко написано:

#! / Bin / ш
P = $ 1
if [-z "$ P"]; тогда
    читать P
фи
cat / proc / "$ P" / status | grep PPid: | grep -o "[0-9] *"
Vi.
источник
2
grep '^PPid:' /proc/$1/status | grep -o '[0-9]*'это все, что тебе нужно. ( Инструменты Unix очень редко делают if [ -z ]; then readэто.)
grawity
@ Grawity Это помогает делать такие вещи, какecho $$ | ppid | ppid | ppid
Vi.
2
UUOC бесполезное использование кошки
Фелипе Альварес
@FelipeAlvarez, мои руки не привыкли печатать < /some/file grep | grep | ....
Ви.
2
Как насчетgrep /some/file
Фелипе Альварес
2
$ ps -p $(ps -p $(echo $$) -o ppid=) -o comm=
    tmux

Немного более сложный пример, который проверяет команду родителя, запустившего текущий процесс. Измените comm = на cmd =, чтобы увидеть полную команду.

sebastian_t
источник
Бесполезное использование эха ? ;)
Боббого
Это действительно требуется на некоторых терминалах. Если честно, я точно не помню, но это действительно решило проблему. : D
sebastian_t
1

Вот быстрое решение, которое также должно работать:

ps $$
Геворк Палян
источник
Это не дает родительский PID, который запрашивал ОП.
Деннис Уильямсон
1

Запуск topс любой опции , которые вы хотите, как -u username and -p PID.

И пока topработает нажатие f, он показывает список опций, которые вы хотите отобразить в topвыходных данных, и отображаемые параметры будут показаны заглавными буквами, а параметры, которые или не отображаются, будут показаны строчными буквами.

Таким образом, введя букву перед параметром, вы можете включить или отключить его. Для ID родительского процесса вы должны ввести bи затем нажать Enter, он будет отображать PPID в верхнем выводе.

Правин С.
источник
1
Он должен использоваться не в интерактивном режиме. Я уже знаю, что htopвы можете настроить PPIDколонку.
Ви.