在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派生一个记录这些信息的进程吗?
答案 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