[英]PID of all child processes of a command
在 bash 脚本中,我想在前台启动一个进程,然后打印作为该进程的子进程启动的所有进程名称和 PID 的列表。 例如,假设我有以下脚本,但我只能修改第一个:
灰:
#!/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 可以 fork 一个记录此信息的进程吗?
更新:在我的回答下面的评论中,结果是:
我需要一些东西来观察一段时间内所有子进程的创建。 鉴于此,过滤以隔离我的子树并不困难。
...是问题背后的意图,它是为了调试目的。
在这种情况下,我建议像这样使用strace
:
strace -f command
-f
将跟踪子进程 - 递归。 由于 forking 和 exec-ing 需要系统调用,所以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
。
您可以尝试使用 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.