我需要一个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?
有什么想法吗?
谢谢
答案 0 :(得分:3)
您可能正在使用GNU Parallel寻找类似的东西:
parallel -j10 cp -rp {} /destination :::: /home/mylist.txt
GNU Parallel是一个通用的并行程序,可以很容易地在同一台机器上或在你有ssh访问权限的多台机器上并行运行作业。
如果要在4个CPU上运行32个不同的作业,并行化的直接方法是在每个CPU上运行8个作业:
GNU Parallel会在完成后生成一个新进程 - 保持CPU处于活动状态,从而节省时间:
<强>安装强>
如果没有为您的发行版打包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内核,当您拥有更少的更复杂的命令时,它可能会派上用场。