一个命令的所有子进程的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
。
在 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
。