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)
小智 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)
您还可以使用 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)