2016-03-07 46 views
3

我正在做一个shell脚本,发生未知情况。我必须执行一定数量的进程,让我们假设12个。但是我想每次限制't'的执行次数。所以如果'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建议。

这可以帮助了解某个进程是否正在运行。我试图创建12个进程并将它们保存在3个不同的变量中,但它不能正常工作。

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 

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

回答

1

这是对脚本的改进。

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 
2

作业内置命令的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个后台进程已启动时,脚本等待最后一个在终止之前结束。

+0

虽然没有什么错'RM -f “$ {} tmp_file”'中,*支柱*机箱也是没有用处的存在。 'rm -f“$ tmp_file”'是等价的。 (这同样适用于下面的'touch') –

+0

特别是如果你认为脚本生成的文件名是数字列表;我的意思是文件名中没有特殊的字符。 谢谢您的信息。我也会看一下手册页。 –

1

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

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 
相关问题