【问题标题】:shell script to loop and start processes in parallel?并行循环和启动进程的shell脚本?
【发布时间】:2015-03-12 03:43:26
【问题描述】:

我需要一个 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 点?

有什么想法吗?

谢谢

【问题讨论】:

  • 听起来像你想要的GNU parallel
  • 无论如何要在不添加任何其他实用程序的情况下执行此操作?我知道并行,但我无法让管理员安装它。
  • 除非您要复制到不同的设备,否则复制文件的速度不太可能得到很大提升,如果您有多个文件,则速度可能会更慢。
  • @exxoid 是什么让您认为您需要管理员来安装 GNU Parallel?

标签: bash shell scripting ksh aix


【解决方案1】:

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

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

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

编辑: 附带说明一下,您可以使用 taskset 将特定的 CPU 内核分配给进程,当您有更少更复杂的命令时,它可能会派上用场。

【讨论】:

    【解决方案2】:

    您可能正在使用 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

    【讨论】:

    • 你的调度器不会为你做这件事吗?
    • 如果你指的是内核中的调度器,那么答案是否定的。
    • 哦,很高兴知道,我不知道。感谢并行命令的信息和建议!
    猜你喜欢
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    相关资源
    最近更新 更多