繁体   English   中英

命令的所有子进程的PID

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM