如何从给定子进程的 PID 获取父进程的 PID?
我知道我可以在 下手动检查它/proc
,我想知道在 Ubuntu 中是否有更智能/更好的方法来实现这一点。请注意,父级可能会或可能不会被杀死。
谢谢
答案1
如何使用命令行根据子进程 ID (PID) 获取父进程 PID (PPID)
使用ps -o ppid=
- 例如,
ps -o ppid= 2072
返回2061
,您可以轻松地在脚本等中使用它。ps -o ppid= -C foo
使用命令给出进程的 PPIDfoo
。您也可以使用老式的ps | grep
:ps -eo ppid,comm | grep '[f]oo'
。 - 更完整的解释:
ps -f 2072
回报唯一标识号 局部局部性病变 C STIME TTY STAT 时间命令 2072 2061 0 07:16 ? S 0:00 /usr/lib/pulseaudio/pulse/gconf-helper
- 关系
pstree
是pstree -s -p 2072
::初始化(1)────pulseaudio(2061)────gconf-helper(2072)
答案2
答案3
pstree
按命令名称使用
您可以使用pstree
子进程名称进行搜索并获取进程 ID (PID) 以及子进程的父母、祖父母和任何子进程:
$ pstree -hp | grep sleep
|-cron(763)---cron(795)---sh(839)---display-auto-br(841)---sleep(8414)
在本例中sleep
是子命令,其 PID 为8414
。其父 ID 为 841,名为display-auto-brightness
。祖父命令是一个 shell ( sh
),其进程 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)
注意,sleep
进程 ID 已更改为14653
。父进程 (PID 841) 休眠 1 分钟,唤醒一瞬间,然后启动一个新sleep
命令,该命令会获取新的进程 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
笔记:又过了一分钟,睡眠命令获得了一个新的 PID (8541)。
答案4
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]