查找子进程的数量

时间:2012-07-18 13:12:47

标签: bash process pid

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

6 个答案:

答案 0 :(得分:13)

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

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

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`

答案 1 :(得分:7)

我更喜欢:

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

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

示例:

~ $ echo $(pgrep -c -P$$)
0
~ $ sleep 20 &
[1] 26114
~ $ echo $(pgrep -c -P$$)
1

答案 2 :(得分:4)

您也可以使用pgrep:

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

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

答案 3 :(得分: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,这需要--ppid的Linux版本。我不知道是否存在BSD ps的等效项。)

答案 4 :(得分:0)

如果作业计数(而不是pid计数)足够了,那么我只提供了仅使用bash的版本:

job_list=($(jobs -p))
job_count=${#job_list[@]}

答案 5 :(得分:-2)

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

counter = `jobs | wc -l`