![如何显示终端 shell 的进程树(包括子进程)?](https://linux22.com/image/83906/%E5%A6%82%E4%BD%95%E6%98%BE%E7%A4%BA%E7%BB%88%E7%AB%AF%20shell%20%E7%9A%84%E8%BF%9B%E7%A8%8B%E6%A0%91%EF%BC%88%E5%8C%85%E6%8B%AC%E5%AD%90%E8%BF%9B%E7%A8%8B%EF%BC%89%EF%BC%9F.png)
当从命令提示符启动脚本时,shell 将为该脚本生成一个子进程。我想用ps
树形输出来展示终端级进程及其子进程之间的关系。
我怎样才能做到这一点?
到目前为止我已经尝试过的
文件:script.sh
#!/bin/bash
ps -f -p$1
然后我从命令行调用脚本,传入终端 shell 的进程 ID:
$ ./script.sh $$
我想要的是这样的
- 顶层(终端)shell 进程
- ./脚本.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
答案1
尝试--forest
(或-H
) 标志
# ps -ef --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
答案2
我读完后发现这个超级用户的回答,注意到这个评论
但不适用于 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
尝试这个:
$ 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]
答案4
如果您只关心自己的流程,这对我来说是最好的。玩得开心。
ps fx | perl -ne "print if /^s*$$/.."'/^\s*$$/'