我如何控制正在运行的进程的数量?

我正在做一个shell脚本,发生未知的情况。 我必须执行一定数量的进程,让我们假设12.但是我想每次都限制执行。 所以如果“t”是3,我将不得不执行3个进程,然后是3,3,最后是3.但是我想自动执行,所以我需要监视正在运行的进程,当其中一个完成时,我必须执行一个剩下的进程。

经过一番研究,我发现了以下命令:

launch backgroundprocess & PROC_ID=$! while kill -0 "$PROC_ID" >/dev/null 2>&1; do echo "PROCESS IS RUNNING" done echo "PROCESS TERMINATED" 

由cuonglm提出。

这可以帮助知道进程是否正在运行。 我试图创build12个进程并将它们保存在3个不同的variables中,但是它不能正常工作。

 processors=3 counter=0 for A in {1..12} do counter=$((counter+1)) backgroundprocess & PID[$A]=$! while [ $counter -eq $processors ] do if kill -0 "$PID[1]" >/dev/null 2>&1; then counter=$(($counter-1)) break fi done done 

你们有没有人知道我该怎么做这项工作?

这是你的脚本的改进。

ps -o pid= -p ${PID[$i]}如果进程存在,则返回PID

num代表完成作业的数量。

 processors=3 counter=0 num=0 for A in {1..12} do counter=$((counter+1)) sleep 4 & if [ $num -eq 0 ] then PID[$A]=$! else PID[$num]=$! fi echo "$A starts" echo $counter while [ $counter -eq $processors ] do for i in `seq 1 $processors` do if [ ! `ps -o pid= -p ${PID[$i]}` ] then counter=$(($counter-1)) echo "$i stopped" num=$i break fi done done done 

shell的作业内置命令可以用来统计后台进程。

附加文件用于等待后台进程的终止。

试试看,测试脚本如下:

 #!/bin/bash -- tmp_file=/tmp/`date "+%Y%m%d%H%M%S$$"` rm -f "${tmp_file}" touch "${tmp_file}" max_nb_processes=12 max_parallel_nb_processes=3 nb_processes=0 while [ $nb_processes -lt $max_nb_processes ] do if [ `jobs -r | wc -l` -lt $max_parallel_nb_processes ] then (backgroundprocess ; printf "end" "" >> "${tmp_file}")& ((nb_processes ++)) else read -t 10 line < "${tmp_file}" fi done wait 

作为参考,第一个版本。

下面的测试版本使用一些轮询:

 #!/bin/bash -- poll_time_second=10 max_nb_processes=12 max_parallel_nb_processes=3 nb_processes=0 while [ $nb_processes -lt $max_nb_processes ] do if [ `jobs -r | wc -l` -lt $max_parallel_nb_processes ] then backgroundprocess & ((nb_processes ++)) else sleep $poll_time_second fi done wait 

只要后台进程少于3个,就会在后台启动一个新进程。

当有3个后台进程时,脚本会在10秒钟后再次检查。

当12个后台进程已经启动时,脚本在终止之前等待最后一个结束。

如果你真的不关心保持处理器繁忙的话,批次是很容易的。

 processors=3 counter=0 for A in {1..12} do backgroundprocess & ((counter++)) if ((counter == processors)); then wait # Block until all background jobs have completed counter=0 fi done