仅显示进程子树

仅显示进程子树

我想显示单个进程及其当前子进程的列表。因此,给定以下进程树:

想象一下以下进程列表:

  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- 到标准输出)。

相关内容