查找子进程的数量

Ada*_*tan 15 bash pid process

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

bet*_*ido 13

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

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

bash_pid=$$
children=`ps -eo ppid | grep -w $bash_pid`
Run Code Online (Sandbox Code Playgroud)

ps将返回父PID列表.然后grep筛选与bash脚本的子项无关的所有进程.为了获得您可以做的孩子数量:

num_children=`echo $children | wc -w`
Run Code Online (Sandbox Code Playgroud)

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

let num_children=num_children-1
Run Code Online (Sandbox Code Playgroud)

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

num_children=`ps --no-headers -o pid --ppid=$$ | wc -w`
Run Code Online (Sandbox Code Playgroud)

  • 如果bash pid是子进程ID的子字符串,则为grep -w $ bash_pid. (3认同)

小智 9

我更喜欢:

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

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

例:

~ $ echo $(pgrep -c -P$$)
0
~ $ sleep 20 &
[1] 26114
~ $ echo $(pgrep -c -P$$)
1
Run Code Online (Sandbox Code Playgroud)


pre*_*orh 5

您还可以使用 pgrep:

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

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


小智 5

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

job_list=($(jobs -p))
job_count=${#job_list[@]}
Run Code Online (Sandbox Code Playgroud)