如何获取给定子进程的父进程 ID?

cac*_*che 85 command-line bash process

如何从给定孩子的 PID 中获取父 PID?

我知道我可以在 下手动检查它/proc,我想知道在 Ubuntu 中是否有更聪明/更好的方法来实现这一点。请注意,父母可能会或可能不会被杀死。

谢谢

ish*_*ish 100

如何使用命令行从子进程 ID (PID) 获取父 PID (PPID)

ps -o ppid=

  • 例如,您可以在脚本中轻松使用的ps -o ppid= 2072返回值2061等。ps -o ppid= -C foo通过命令给出进程的 PPID foo。您也可以使用老式的ps | grep: ps -eo ppid,comm | grep '[f]oo'
  • 更全面的解释:ps -f 2072退货
    UID PID   PPID   C STIME TTY STAT TIME CMD
    izx 2072   2061   0 07:16 ? S 0:00 /usr/lib/pulseaudio/pulse/gconf-helper
    
  • pstree关系是:pstree -s -p 2072
    init(1)???pulseaudio(2061)???gconf-helper(2072)
    


Gil*_*not 26

仅使用变量获取父 PID :

echo $PPID
Run Code Online (Sandbox Code Playgroud)

如果您需要来自该父 pid 的命令:

cat /proc/$PPID/comm
Run Code Online (Sandbox Code Playgroud)

如果您需要完整的命令行(带有所有选项):

cat /proc/$PPID/cmdline
Run Code Online (Sandbox Code Playgroud)

解释

  • $PPID 由shell定义,它是父进程的PID
  • 在 中/proc/,您有一些包含每个进程的 PID 的目录。然后,如果你cat /proc/$PPID/comm,你回显PID的命令名称

检查man proc

  • 这是最好的答案。procfs 是一个内核 API。执行命令并解析输出是无稽之谈。 (2认同)
  • 这也可能是最可移植的,`PPID` 被定义为 POSIX 标准的一部分,因此任何符合 POSIX 的 shell 都应该适当地设置它。见 https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html (2认同)

Win*_*nix 11

使用pstree的命令名称

使用pstree您可以按子进程名称搜索并获取进程 ID (PID) 以及子进程的父进程、祖父进程和任何子进程:

$ pstree -hp | grep sleep
           |-cron(763)---cron(795)---sh(839)---display-auto-br(841)---sleep(8414)
Run Code Online (Sandbox Code Playgroud)

在这种情况下sleep是子命令,它的 PID 是8414. 它的父 ID 是 841,称为display-auto-brightness。祖父sh进程是一个 shell ( ),进程 ID 为839。曾祖父母cron的进程 ID 为795。曾曾祖父母cron的进程 ID 也为763

如果要按进程 IDsleep而不是名称搜索,可以使用:

$ pstree -hp | grep 14653
           |-cron(763)---cron(795)---sh(839)---display-auto-br(841)---sleep(14653)
Run Code Online (Sandbox Code Playgroud)

请注意,sleep进程 ID 更改为14653。父sleep进程(PID 841) 休眠 1 分钟,唤醒一秒钟,然后启动一个新命令,该命令获取新的进程 ID。这是搜索sleep比按进程 ID 搜索更容易的另一个原因。

此代码取自:根据日出和日落自动调整显示亮度并适应此问题。


要查看一直返回到引导过程的嵌套链,请使用 PID 而不是名称:

$ pstree -aps 8541
systemd,1 splash fastboot kaslr
  ??cron,763 -f
      ??cron,795 -f
          ??sh,839 -c    /usr/local/bin/display-auto-brightness
              ??display-auto-br,841 /usr/local/bin/display-auto-brightness
                  ??sleep,8541 60
Run Code Online (Sandbox Code Playgroud)

注意:又过了一分钟,sleep 命令获得一个新的 PID (8541)。


Pal*_*Jha 5

ps -efj 也可以用于相同的。

例如,

> ps -efj | head
UID        PID  PPID  PGID   SID  C STIME TTY          TIME CMD
root         1     0     1     1  0 Jul01 ?        00:00:13 /sbin/init splash
root         2     0     0     0  0 Jul01 ?        00:00:00 [kthreadd]
root         3     2     0     0  0 Jul01 ?        00:00:02 [ksoftirqd/0]
root         5     2     0     0  0 Jul01 ?        00:00:00 [kworker/0:0H]
root         7     2     0     0  0 Jul01 ?        00:06:44 [rcu_sched]
root         8     2     0     0  0 Jul01 ?        00:00:00 [rcu_bh]
root         9     2     0     0  0 Jul01 ?        00:00:00 [migration/0]
root        10     2     0     0  0 Jul01 ?        00:00:08 [watchdog/0]
root        11     2     0     0  0 Jul01 ?        00:00:08 [watchdog/1]
Run Code Online (Sandbox Code Playgroud)