Як отримати батьківський PID заданого процесу в GNU / Linux з командного рядка?


90

Вирішено перед запитом: cat /proc/1111/status | grep PPid


швидше: 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 and cut:sed -rn '/PPid/ s/^.*:\s+// p' < status
Мар'ян

Відповіді:


107

Командний рядок:

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

Це одна з тих речей, які я навчаюсь, забуваю, переучую, повторюю. Але це корисно. Прапор команди команди pstree показує дерево з листом у N:

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

12

Батьківський pid знаходиться в змінній оболонці PPID, так що

echo $PPID

1
Так, але 1. Я хочу батьківських підручників іншого процесу, 2. Я хочу вміти переходити всіх предків до інтиту.
Ві.

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 $$.


1
pstreeце найприємніше, що я тут бачив.
судо

ps jчудово, тому що він доступний у багатьох дистрибутивах і легко компонується
Коннор МакКормік

6

Прочитати / proc / $ PID / статус. Легко сценарій:

#! / бін / ш
P = 1 долар
якщо [-z "$ P"]; тоді
    читати П
фі
cat / proc / "$ P" / статус | grep PPid: | grep -o "[0-9] *"

2
grep '^PPid:' /proc/$1/status | grep -o '[0-9]*'це все, що вам потрібно. ( Дуже рідко для інструментів Unix це робити if [ -z ]; then read.)
величезний досвід

@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

Трохи складніший приклад, який перевіряє команду батька, який запустив поточний процес Change comm = to cmd =, щоб побачити повну команду


Марне використання відлуння ? ;)
Боббого

Насправді це потрібно на деяких терміналах. Якщо чесно, я точно не пам’ятаю, але це фактично вирішило проблему. : D
sebastian_t


1

Запускайте topбудь-які варіанти, які вам подобаються -u username and -p PID.

І поки topпрацює натискання f, він показує перелік параметрів, які ви хочете відобразити у topвисновку, а відображені параметри будуть показані літерами CAPITAL, а параметри, які не відображатимуться, будуть показані малими літерами.

Отже, ввівши букву перед параметром, ви можете включити або відключити її. Для ідентифікатора батьківського процесу потрібно ввести, bа потім натиснути Enter, він відображатиме PPID у верхньому висновку.


1
Її слід використовувати неінтерактивно. Я вже знаю, що у htopвас можна налаштувати PPIDстовпчик.
Ві.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.