18

如何从脚本本身中找到 bash 脚本的子进程数?

4

6 回答 6

14

要获取 bash 脚本的 PID,您可以使用 variable $$

然后,要获得它的孩子,你可以运行:

bash_pid=$$
children=`ps -eo ppid | grep -w $bash_pid`

ps将返回父 PID 列表。然后grep过滤所有与 bash 脚本的子进程无关的进程。为了获得孩子的数量,您可以执行以下操作:

num_children=`echo $children | wc -w`

实际上,您将获得的数字将减 1,因为ps它也是 bash 脚本的子代。如果您不想将执行计算ps为一个孩子,那么您可以通过以下方式解决该问题:

let num_children=num_children-1

更新:为了避免调用grep,可能会使用以下语法(如果已安装的版本支持ps):

num_children=`ps --no-headers -o pid --ppid=$$ | wc -w`
于 2012-07-18T13:18:29.630 回答
10

我更喜欢:

num_children=$(pgrep -c -P$$)

它只产生一个进程,您不必计算字数或通过管道中的程序调整 PID 的数量。

例子:

~ $ echo $(pgrep -c -P$$)
0
~ $ sleep 20 &
[1] 26114
~ $ echo $(pgrep -c -P$$)
1
于 2014-02-24T18:51:52.333 回答
5

您还可以使用 pgrep:

child_count=$(($(pgrep --parent $$ | wc -l) - 1))

用于pgrep --parent $$获取 bash 进程的子进程列表。
然后wc -l在输出上使用以获取行数:$(pgrep --parent $$ | wc -l) 然后减去 1(wc -l即使pgrep --parent $$为空也报告 1)

于 2013-10-23T19:00:09.530 回答
4

如果作业计数(而不是 pid 计数)足够,我只提供了一个 bash-only 版本:

job_list=($(jobs -p))
job_count=${#job_list[@]}
于 2019-09-20T18:59:14.783 回答
2

ps与选项一起使用--ppid以选择当前 bash 进程的子进程。

bash_pid=$$
child_count=$(ps -o pid= --ppid $bash_id | wc -l)
let child_count-=1    # If you don't want to count the subshell that computed the answer

ps(注意:这需要for的 Linux 版本--ppid。我不知道是否有与 BSD 等效的版本ps。)

于 2012-07-18T13:24:15.753 回答
-2

您可以评估 shell 内置命令作业,例如:

counter = `jobs | wc -l`
于 2012-07-18T13:24:59.533 回答