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

171915
Vi.

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

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

9 ответов на вопрос

92
Dennis Williamson

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

ps -o ppid= -p 1111 

Функция:

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

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

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

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

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

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

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

Знак `=` не обязателен, по крайней мере в OS X 10.8.2. jtbandes 11 лет назад 0
@jtbandes: знак равенства, используемый здесь, подавляет вывод строки заголовка ([Linux] (http://linux.die.net/man/1/ps) и [OS X] (https://developer.apple) .com / библиотека / Mac / # документация / Darwin / ссылки / страница справочник / man1 / ps.1.html)). Dennis Williamson 11 лет назад 5
11
Ivan Novotny

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

echo $PPID 
Да, но 1. Я хочу родительский pid другого процесса, 2. Я хочу, чтобы все предки могли проходить через init. Vi. 11 лет назад 1
С другой стороны, использование `$ PPID` просто решило проблему, на которую Google предложил эту страницу в качестве ответа. Paul Whittaker 11 лет назад 1
11
user194394

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

pstree -sA $(pgrep badblocks) systemd---sudo---mkfs.ext4---badblocks 
6
kenorb

Эта команда:

ps j 

распечатает родительские идентификаторы ( PPID) всех процессов.

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

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

ps j 1234 | awk 'NR>1 ' # BSD ps ps j 1234 | awk 'NR>1 ' # GNU ps 

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

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

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

`pstree` - самый хороший из тех, что я видел здесь. sudo 6 лет назад 0
5
Vi.

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

#! / Bin / ш P = $ 1 if [-z "$ P"]; затем читать P фи cat / proc / "$ P" / status | grep PPid: | grep -o "[0-9] *" 
`grep '^ PPid:' / proc / $ 1 / status | grep -o '[0-9] *' `- это все, что вам нужно. (Для инструментов Unix очень редко делать `if [-z]; затем читать`.) grawity 13 лет назад 1
@grawity Это помогает делать такие вещи, как `echo $$ | ppid | ppid | ppid` Vi. 13 лет назад 0
UUOC бесполезное использование кошки Felipe Alvarez 9 лет назад 2
@FelipeAlvarez, мои руки не используются для ввода `</ some / file grep | grep | ... `. Vi. 9 лет назад 0
Как насчет `grep / some / file` Felipe Alvarez 9 лет назад 2
Спасибо за этот ответ, он помог мне во встроенной системе, у которой был только один флаг для ps (-w для широкого вывода), поэтому все ответы, использующие ps, не работали для меня. Спасибо! Citizen Kepler 7 лет назад 0
3
jthill

В Linux:

ps hoppid $thatprocess 
2
sebastian_t
$ ps -p $(ps -p $(echo $$) -o ppid=) -o comm= tmux 

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

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

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

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

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

Он должен использоваться не в интерактивном режиме. Я уже знаю, что в `htop` вы можете настроить столбец` PPID`. Vi. 11 лет назад 1
1
Gevork Palyan

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

ps $$ 
Это не дает родительский PID, который запрашивал ОП. Dennis Williamson 10 лет назад 0

Похожие вопросы