如何显示包含子项的终端外壳的进程树?


30

从命令提示符启动脚本时,外壳程序将为该脚本生成一个子进程。我想以ps树样式输出显示终端级进程与其子级之间的关系。
我怎样才能做到这一点?

到目前为止我尝试过的

文件: script.sh

#!/bin/bash

ps -f -p$1

然后,我从命令行调用脚本,并传入终端外壳的进程ID:

$ ./script.sh $$

我想要的是这样的

  • 顶层(终端)shell过程
  • ./script.sh
  • ps命令本身的过程
USER    PID  [..]
ubuntu 123     -bash
ubuntu 1234    \_ bash ./script.sh
ubuntu 12345      \_ ps auxf 

我得到的是:

  PID TTY      STAT   TIME COMMAND
14492 pts/24   Ss     0:00 -bash

2
为什么不使用pstree
muru

@muru我尝试过pstree并且无法获得有意义的输出,我认为pstree $$只是产生的bash--pstree并不是我想要的。
the_velour_fog

您想要的不是什么?您已替换了脚本,然后ps,除了,您还希望看到pstree什么?
muru

@muru您的权利在技术上是我想要的,但是太小了。即,如何确定没有ps的PID的情况下正在查看的进程,如ps将其显示为表输出?
the_velour_fog

4
pstree -p $$?或者,如果您希望更多的命令行显示,请参阅pstree -pa $$。或者,如果您要显示所有正在运行的父进程,请pstree -psa $$
muru

Answers:


30

尝试

# ps -aef --forest
root     114032   1170  0 Apr05 ?        00:00:00  \_ sshd: root@pts/4
root     114039 114032  0 Apr05 pts/4    00:00:00  |   \_ -bash
root      56225 114039  0 13:47 pts/4    00:00:16  |       \_ top
root     114034   1170  0 Apr05 ?        00:00:00  \_ sshd: root@notty
root     114036 114034  0 Apr05 ?        00:00:00  |   \_ /usr/libexec/openssh/sftp-server
root     103102   1170  0 Apr06 ?        00:00:03  \_ sshd: root@pts/0
root     103155 103102  0 Apr06 pts/0    00:00:00  |   \_ -bash
root     106798 103155  0 Apr06 pts/0    00:00:00  |       \_ su - postgres
postgres 106799 106798  0 Apr06 pts/0    00:00:00  |           \_ -bash
postgres  60959 106799  0 14:39 pts/0    00:00:00  |               \_ ps -aef --forest
postgres  60960 106799  0 14:39 pts/0    00:00:00  |               \_ more

5
这个问题意味着寻找从特定进程开始的进程树,将$1参数作为脚本或$$用于查看从当前shell开始的树...您能否更新您的答案以包括有关如何从以下位置获取林的信息一个特定的过程?
filbranden

23

我在阅读此超级用户答案并注意到此评论后找到了它

但不是PID(-p),因为它仅显示特定进程,而会话(-g)

和实验

ps f -g<PID>

结果

$ ./script.sh $$
  PID TTY      STAT   TIME COMMAND
14492 pts/24   Ss     0:00 -bash
 9906 pts/24   S+     0:00  \_ bash ./script.sh 14492
 9907 pts/24   R+     0:00      \_ ps f -g14492

3
从手册页:OUTPUT MODIFIERS: f ASCII-art process hierarchy (forest)
phyatt

1

您可以使用命令ps f -g <PID>并为PID以下命令统计根进程:

#> ps f -g 0

PID TTY      STAT   TIME COMMAND
2 ?        S      0:00 [kthreadd]
3 ?        S      0:01  \_ [ksoftirqd/0]
7 ?        S      0:19  \_ [rcu_sched]

1

尝试这个:

 $ ps -afx
  PID TTY      STAT   TIME COMMAND
    2 ?        S      0:00 [kthreadd]
    4 ?        I<     0:00  \_ [kworker/0:0H]
    6 ?        I<     0:00  \_ [mm_percpu_wq]
    7 ?        S      0:14  \_ [ksoftirqd/0]
    8 ?        I      0:34  \_ [rcu_sched]
    9 ?        I      0:00  \_ [rcu_bh]
   10 ?        S      0:00  \_ [migration/0]
   11 ?        S      0:00  \_ [watchdog/0]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.