shell脚本:并行运行一批N条命令,等待所有命令完成,再运行下N条


9

任务:运行由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

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

问题:有什么更好的方法来实现?

PS可能的状态报告方法:

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

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

Answers:


8

这正是gnu并行设计的目的,因此我强烈建议您使用它。特别是,将其作为信号量运行:

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



3

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

睡30&睡40&睡120&等待

它一直等到所有命令都完成为止,例如,对于本示例,至少要等待120秒。

希望这可以帮助。


0

正如上面的Phil Hollenback所描述的,我们试图使用GNU sem实用程序,但是发现它太重了(300多个实例使机器瘫痪)。我到处寻找类似的工具来实现轻量级计数信号灯,但找不到合适的工具。

所以我自己用羊群来实现,这叫做信号量

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.