linux - 遍历进程树

标签 linux shell unix pstree

我有以下场景。

用户将键入进程的 PID,脚本应显示进程及其 PID 的子进程、子进程(等等),并应以树格式列出。

我尝试使用 pstree PIDps faux PID,但它不起作用。似乎它没有将进程的 PID 作为参数。

有什么想法吗?

最佳答案

只是想记录我与此问题相关的步骤。

假设我在终端中执行:

~$ echo "read -p 'Press Enter'" > mytest.sh
~$ chmod +x mytest.sh
~$ bash -c bash
~$ bash -c ./mytest.sh

... 并让它在 read 输入提示处等待。然后,我总能找到 mytest.sh 的 pid,例如:

$ ps axf | grep mytest
20473 pts/2    S+     0:00              |   |   \_ grep --color=tty mytest
20308 pts/5    S+     0:00              |   |       \_ bash -c ./mytest.sh

...但是,我想输出一个 ps axf 树,限制为 mytest.sh 的某个父级;查看完整的 ps axf,我们可以看到一个层次结构:

$ ps axf

 1489 ?        Sl     1:39              \_ gnome-terminal --sm-client-id 106ab86
 1511 ?        S      0:00              |   \_ gnome-pty-helper
...
20238 pts/5    Ss     0:00              |   \_ bash
20274 pts/5    S      0:00              |   |   \_ bash
20308 pts/5    S+     0:00              |   |       \_ bash -c ./mytest.sh
...

然后,假设我不想作为父级“扫描”gnome-terminal (1489),而是想从 bash (20238) 开始.. 所以,我想获得这个输出:

$ ps f -p 20238 20274 20308
  PID TTY      STAT   TIME COMMAND
20238 pts/5    Ss     0:00 bash
20274 pts/5    S      0:00  \_ bash
20308 pts/5    S+     0:00      \_ bash -c ./mytest.sh

...除了,我不想手动复制/粘贴子 PID :)

我可以使用pstree:

$ pstree -a -p 20238
bash,20238
  └─bash,20274
      └─bash,20308 -c ./mytest.sh

$ pstree -p 20238
bash(20238)───bash(20274)───bash(20308)

...不幸的是,输出与我更喜欢的 ps axf 中的输出不完全相同。

所以,我可以简单地使用 pstree 来获取子 PID:

$ pstree -p 20238 | sed 's/(/\n(/g' | grep '(' | sed 's/(\(.*\)).*/\1/'
20238
20274
20308

$ pstree -p 20238 | sed 's/(/\n(/g' | grep '(' | sed 's/(\(.*\)).*/\1/' | tr "\n" ,
20238,20274,20308,

然后使用它们来获取 ps axf 树,仅基于父级的 PID:

$ ps f -p $(pstree -p 20238 | sed 's/(/\n(/g' | grep '(' | sed 's/(\(.*\)).*/\1/' | tr "\n" " ")
  PID TTY      STAT   TIME COMMAND
20238 pts/5    Ss     0:00 bash
20274 pts/5    S      0:00  \_ bash
20308 pts/5    S+     0:00      \_ bash -c ./mytest.sh

好吧,希望这对某人有帮助,
干杯!

关于linux - 遍历进程树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5213973/

相关文章:

linux - 在linux中显示目录中所有文件中的特定行

shell - sh :cannot set terminal process group (-1) inappropriate ioctl for device error mean? 是什么意思

linux - vim 向上或向下移动选定代码块

linux - 如何发送格式化的邮件正文 Unix 脚本

linux - 为什么加载 ELF64 header 会导致段错误?

linux - 内核如何通知用户空间程序中断发生

linux - 抑制来自 bash 脚本的控制台错误

linux - 遍历每一行

c - 从文件的最后一行读取到 C 中的第一行

linux - uniq 命令未检测到重复行