2010-06-08 09:42:29 +0000 2010-06-08 09:42:29 +0000
94
94

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

Решили до того, как спросить: cat /proc/1111/status | grep PPid.

Ответы (10)

112
112
112
2010-06-08 11:21:06 +0000

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

ps -o ppid= -p 1111

Функция:

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

Alias (функция предпочтительнее ):

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.

15
15
15
2013-01-31 20:32:13 +0000

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

pstree -sA $(pgrep badblocks)
systemd---sudo---mkfs.ext4---badblocks
```.
13
13
13
2012-09-24 11:55:28 +0000

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

echo $PPID
12
12
12
2016-02-19 21:31:34 +0000

Для печати родительских идентификаторов (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 $$.

6
6
6
2010-06-08 09:44:05 +0000

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

#!/bin/sh P=$1 if [-z "$P"]; then read P fi cat /proc/"$P"/status | grep PPid: | grep -o "[0-9]\*"
4
4
4
2014-10-21 17:30:05 +0000

На Linux:

ps hoppid $thatprocess
2
2
2
2014-10-19 20:08:11 +0000
$ ps -p $(ps -p $(echo $$) -o ppid=) -o comm=
    tmux

Немного более сложный пример, проверяющий команду родителя, который запустил текущий процесс Change comm= to cmd= to see full command

1
1
1
2012-11-23 12:21:12 +0000

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

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

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

1
1
1
2013-09-12 06:18:04 +0000

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

ps $$
0
0
0
2019-10-30 21:51:11 +0000

все родительские процессы pid

Я пришел сюда, когда пытался найти “все родительские процессы pid”. В итоге я создал свою собственную рекурсивную функцию для этого.

pid_lineage.sh

#!/bin/bash -eu

main(){
  ps -p ${1:-$$} -h -o pid,ppid,args | \
    (
      read pid ppid args
      echo -e "$pid\t$args"
      [[$pid -gt 1]] && main $ppid
    )
}

main "$@"

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

6
10
10
7
18