题 shell脚本:并行运行一批N个命令,等待全部完成,然后运行N.


任务:运行由3-5个命令组成的块(并行/后台)。 示例块:

dd if=/dev/urandom of=/mnt/1/x bs=1024 count=1024000000 &
dd if=/dev/urandom of=/mnt/2/x bs=1024 count=1024000000 &
dd if=/dev/urandom of=/mnt/3/x bs=1024 count=1024000000 &

完成后,下一个块应该运行。 我想,这可以通过锁定文件来完成:

task1.sh:

real_task1 real_param1 ; rm /var/lock/myscript/task1.lock

task2.sh:

real_task2 real_param1 ; rm /var/lock/myscript/task2.lock

...

taskgen.sh:

# loop
 # while directory isn't empty - wait...
 gen_tasks.pl # build task files from some queue
 for i in 1 2 3; do touch /var/lock/myscript/task$i.lock ; done
 ./task1.sh &
 ./task2.sh &
 ./task3.sh &
 # if task1.sh doesn't exits then exit, else loop waits for files to be deleted

可以找到许多检查目录是否为空的方法 这里,不确定使用哪个;

:有没有更好的方法来实现这个?

附:可能的状态报告方法:

 command && report_good_state.sh taskid ;  report_state_done.sh taskid; rm /var/lock/myscript/taskN.lock

5
2018-04-14 03:29




伙计们,只是不知道该说些什么:所有答案都是正确的,谢谢! - kagali-san


答案:


这正是如此 gnu parallel 是专为,所以我强烈建议你使用它。特别是,看看它的运行情况 作为信号量

for i in {1..4}
do
  echo running $i
  sem -j3 df dd if=/dev/urandom of=/mnt/$i/x bs=1024 count=1024000000 ";" echo done
done
# sem --wait waits until all jobs are done.
sem --wait

6
2018-04-14 04:22





也许有些变化呢?

while true
do
  ./task1.sh&
  pid1=$!
  ./task2.sh&
  pid2=$!
  ./task3.sh&
  pid3=$!
  wait $pid1
  wait $pid2
  wait $pid3
done

7
2018-04-14 03:45



但是,如果可用的话,GNU并行更好。 - Eduardo Ivanec


你有什么特别的理由不使用像 GNU并行?如果你必须使用bash,那么考虑如下所述的方法 这篇博文 (等待和命名管道在这里很有帮助)。


5
2018-04-14 03:48





“等待”等待所有后台作业完成。样品:

睡30& 睡40& 睡120& 等待

它等待直到所有命令完成,即该示例至少120秒。

希望这可以帮助。


3
2018-04-14 04:37





我们试着用 GNU sem实用程序,如上面的菲尔霍伦巴克所描述的,但发现它太重了(300多个实例使机器瘫痪)。我环顾四周寻找类似工具来实现轻量级计数信号量但找不到合适的信号量。

所以我自己使用flock实现了一个,它被称为 信号灯


0
2018-03-18 13:10