shell脚本循环并并行启动进程?

时间:2015-01-14 02:12:26

标签: bash shell scripting ksh aix

我需要一个shell脚本,它将创建一个循环来启动从文件读入的并行任务...

......中的某些内容。

#!/bin/bash
mylist=/home/mylist.txt
for i in ('ls $mylist')
do
do something like cp -rp $i /destination &
end
wait

所以我要做的就是在后台用“&”发送一堆任务对于$ mylist中的每一行,等待它们在现有之前完成。

但是,可能会有很多行,所以我想控制多少并行后台进程启动;希望能够最大化说... 5? 10?

有什么想法吗?

谢谢

2 个答案:

答案 0 :(得分:3)

您可能正在使用GNU Parallel寻找类似的东西:

parallel -j10 cp -rp {} /destination :::: /home/mylist.txt

GNU Parallel是一个通用的并行程序,可以很容易地在同一台机器上或在你有ssh访问权限的多台机器上并行运行作业。

如果要在4个CPU上运行32个不同的作业,并行化的直接方法是在每个CPU上运行8个作业:

Simple scheduling

GNU Parallel会在完成后生成一个新进程 - 保持CPU处于活动状态,从而节省时间:

GNU Parallel scheduling

<强>安装

如果没有为您的发行版打包GNU Parallel,您可以进行个人安装,不需要root访问权限。这可以在10秒内完成:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

有关其他安装选项,请参阅http://git.savannah.gnu.org/cgit/parallel.git/tree/README

了解详情

查看更多示例:http://www.gnu.org/software/parallel/man.html

观看介绍视频:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

完成教程:http://www.gnu.org/software/parallel/parallel_tutorial.html

注册电子邮件列表以获得支持:https://lists.gnu.org/mailman/listinfo/parallel

答案 1 :(得分:2)

您的任务管理器会让您看起来可以运行许多并行作业。实际运行多少可以获得最大效率取决于您的处理器。总的来说,您不必担心启动太多进程,因为您的系统会为您执行此操作。如果你想限制它们,因为数字可能会非常高,你可以使用这样的东西(如果你每次都执行一个cp命令):

...
while ...; do
    jobs=$(pgrep 'cp' | wc -l)
    [[ $jobs -gt 50 ]] && (sleep 100 ; continue)
    ...
done

运行cp命令的数量将存储在jobs变量中,在开始新的迭代之前,它将检查是否已有太多。请注意,我们跳转到一个新的迭代,因此您必须跟踪已执行的命令数。或者,您可以使用wait

编辑: 另外,您可以使用taskset为进程分配特定的CPU内核,当您拥有更少的更复杂的命令时,它可能会派上用场。