我想显示单个进程及其当前子进程的列表。因此,给定以下进程树:
想象一下以下进程列表:
PID TTY STAT TIME COMMAND
2 ? S 0:00 [kthreadd]
3 ? S 0:06 \_ [ksoftirqd/0]
...snip...
1292 ? Ss 0:06 /usr/sbin/gpm -m /dev/input/mice -t exps2
1426 ? Ss 0:00 /usr/lib/postfix/master
9785 ? S 0:00 \_ qmgr -l -t fifo -u
12301 ? S 0:00 \_ pickup -l -t fifo -u -c
1545 ? Ss 0:05 /usr/sbin/apache2 -k start
1570 ? S 0:00 \_ /usr/sbin/apache2 -k start
...snip...
我希望只显示进程 1426 及其子进程。如下所示:
PID TTY STAT TIME COMMAND
1426 ? Ss 0:00 /usr/lib/postfix/master
9785 ? S 0:00 \_ qmgr -l -t fifo -u
12301 ? S 0:00 \_ pickup -l -t fifo -u -c
有没有简单的方法可以做到这一点?
答案1
$ ps -p 1426 --ppid 1426 --forest
或者:
$ ps -eo pid,ppid,tty,stat,time,command --forest | awk '$1 == 1426 || $2 == 1426'
显示详细信息命令。
答案2
您可以使用pstree这样做,并得到一个格式良好的输出
pstree -p 22221
mysqld_safe(22221)─┬─logger(22334)
└─mysqld(22332)─┬─{mysqld}(22335)
├─{mysqld}(22336)
├─{mysqld}(22337)
├─{mysqld}(22338)
├─{mysqld}(22340)
├─{mysqld}(22341)
├─{mysqld}(22342)
├─{mysqld}(22343)
├─{mysqld}(22346)
└─{mysqld}(22394)
答案3
以下脚本显示正在运行的所有进程tmux
:
#!/usr/bin/env bash
set -eu
my_pid=$$
subtree_pids() {
local pid=$1 level=${2:-0}
if [ "$pid" = "$my_pid" ]; then
return
fi
echo "$pid"
ps --ppid "$pid" -o pid= | while read -r pid; do
subtree_pids "$pid" $((level + 1))
done
}
server_pid=$(tmux display-message -pF '#{pid}')
ps -p "$(subtree_pids "$server_pid" | paste -sd,)" -Ho pid,ppid,comm,args
输出如下所示:
7170 1 tmux: server tmux -f /home/yuri/.tmux-windows at
7171 7170 bash bash --rcfile /dev/fd/63 -i
7182 7171 vim vim ...
7173 7170 bash bash --rcfile /dev/fd/63 -i
7183 7173 vim vim ...
为此,它递归调用ps --ppid ...
。my_pid
存储脚本本身的 PID,以避免无限递归。level
变量只是为了以防您需要调试脚本。=
使其ps -o pid=
不显示标题。paste -sd,
将换行符分隔的列表转换为逗号分隔的列表(-d
指定分隔符,更多信息请参见这里).tmux display-message
显示服务器 PID(-p
- 到标准输出)。