并行运行 shell 脚本

新手上路,请多包涵

我有一个 shell 脚本

  1. 随机播放一个大文本文件(600 万行和 6 列)
  2. 根据第一列对文件进行排序
  3. 输出 1000 个文件

所以伪代码看起来像这样

file1.sh

#!/bin/bash
for i in $(seq 1 1000)
do

  Generating random numbers here , sorting  and outputting to file$i.txt

done

有没有办法在 parallel 中运行这个shell脚本来充分利用多核CPU?

眼下, 。 /file1.sh 执行 1 到 1000 次,非常慢。

谢谢你的帮助。

原文由 Tony 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 978
2 个回答

查看 bash subshells ,它们可用于并行运行部分脚本。

我没有对此进行测试,但这可能是一个开始:

 #!/bin/bash
for i in $(seq 1 1000)
do
   ( Generating random numbers here , sorting  and outputting to file$i.txt ) &
   if (( $i % 10 == 0 )); then wait; fi # Limit to 10 concurrent subshells.
done
wait

原文由 Anders Lindahl 发布,翻译遵循 CC BY-SA 2.5 许可协议

另一种非常方便的方法是使用 gnu parallel ,如果您还没有它,它非常值得安装;如果任务不一定花费相同的时间,这是非常宝贵的。

 seq 1000 | parallel -j 8 --workdir $PWD ./myrun {}

将启动 ./myrun 1./myrun 2 等,确保一次运行 8 个作业。如果您想同时在多个节点上运行,它也可以获取节点列表,例如在 PBS 作业中;我们向用户提供的关于如何在我们的系统上执行此操作的说明在 这里

更新添加: 您要确保您使用的是 gnu-parallel,而不是 moreutils 包中同名的更有限的实用程序( 此处 描述了两者的不同历史。)

原文由 Jonathan Dursi 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏