Bash:命令的所有子进程的PID

时间:2017-03-08 15:20:34

标签: linux bash pid

在bash脚本中,我想在前台启动一个进程,然后打印作为该进程的子进程启动的所有进程名称和PID的列表。例如,假设我有以下脚本,但我只能修改第一个脚本:

A.sh:

#!/bin/bash
B.sh

B.sh:

#!/bin/bash
C.sh

C.sh:

#!/bin/bash
echo "Running C.sh"

如果不修改B.sh,C.sh或echo命令,并且没有在后台启动任何子进程,我希望A.sh打印以下内容:

B.sh 1208
C.sh 1210
echo 1211

当子进程在A.sh的前台运行时,可以A.sh派生一个记录这些信息的进程吗?

2 个答案:

答案 0 :(得分:2)

更新:在下面的评论中,我的回答是:

  

我需要能够在一段时间内观察所有子进程的创建。鉴于此,过滤以隔离我的子树并不困难。

...是问题背后的意图,它是出于调试目的。

在这种情况下,我建议像这样使用strace

strace -f command

-f将以递归方式跟踪子进程。由于分叉和执行需要系统调用,strace将列出任何子项创建和pid。

原始回答:

您可以使用pgrep

run_process &
pid=${!}
pgrep --parent "${pid}"
wait # wait for run_process to finish

顺便说一句,你可能想要使用pstree命令,这很好用:

run_process &
pid=${!}
pstree -p "${pid}"
wait # wait for run_process to finish

无论如何,您需要安装pstree

答案 1 :(得分:0)

您可以尝试使用A.sh

执行此操作
#!/usr/bin/env bash
./B.sh &
b_PID=$!
./C.sh &
c_PID=$!

echo "B.sh $b_PID"
echo "C.sh $c_PID"

输出看起来像这样

B.sh 22802
C.sh 22803
Running C.sh