一个命令的所有子进程的PID

PID of all child processes of a command

在 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 分叉记录此信息的进程吗?

您可以尝试使用 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

更新: 在我的回答下方的评论中,结果是:

I need something that observes the creation of all child processes during a span of time. Given that, filtering to isolate my subtree will not be difficult.

...是问题背后的意图,它是为了调试目的。

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

strace -f command

-f 将递归地跟踪子进程。由于 fork 和 exec-ing 需要系统调用,strace 将列出所有子创建加上 pids。


原回答:

你可以使用 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