pstree按命令名称使用

pstree按命令名称使用

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

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

谢谢

答案1

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

使用ps -o ppid=

  • 例如,ps -o ppid= 2072返回2061,您可以轻松地在脚本等中使用它。ps -o ppid= -C foo使用命令给出进程的 PPID foo。您也可以使用老式的ps | grepps -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
    
  • 关系pstreepstree -s -p 2072::
    初始化(1)────pulseaudio(2061)────gconf-helper(2072)
    

答案2

仅使用获取父 PID 的变量:

echo $PPID

如果你需要来自这个父进程的命令:

cat /proc/$PPID/comm

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

cat /proc/$PPID/cmdline

解释

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

查看进程管理器

答案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]

相关内容