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

如何从给定的孩子pid获得父pid?

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

谢谢

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

使用ps -o ppid=

  • 例如ps -o ppid= 2072返回2061 ,你可以在脚本等中轻松使用ps -o ppid= -C foo用命令foo给出进程的PPID。 你也可以使用老式的ps | grep ps | grepps -eo ppid,comm | grep '[f]oo' 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辅助(2072)
    

仅使用shell变量来获取父PID:

 echo $PPID 

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

 cat /proc/$PPID/comm 

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

 cat /proc/$PPID/cmdline 

说明

  • $PPID由shell定义,它是父进程的PID
  • /proc/ ,你有一些dirs与每个进程的PID。 然后,如果你cat /proc/$PPID/comm ,则回显PID的命令名

检查man proc

使用命令名称的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

如果要按sleep的进程ID而不是名称进行搜索,可以使用:

 $ pstree -hp | grep 14653 |-cron(763)---cron(795)---sh(839)---display-auto-br(841)---sleep(14653) 

请注意, sleep进程ID已更改为14653 。 父(PID 841)hibernate1分钟,唤醒一瞬间,然后启动新的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 

注意:另一分钟已经过去,sleep命令获得一个新的PID(8541)。