【问题标题】:How to use gnu_parallel to run multiple executable and/or bash scripts?如何使用 gnu_parallel 运行多个可执行和/或 bash 脚本?
【发布时间】:2019-04-29 14:31:25
【问题描述】:

我最近一直在尝试以一种比打开多个终端实例并分别在脚本中执行更方便的方式并行运行我的脚本。

过去几天我一直在尝试学习如何使用 gnu_parallel,但我仍然有点无能为力,希望有人能提供一个直接的例子。

假设我有一个名为 blah.exe 的 g++ 编译代码和一个名为 blah.sh 的 bash 脚本,它们可以完美地单独运行,但我想在不同的目录中执行它们。

我一直在阅读 https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Working-as-xargs--n1.-Argument-appending

https://www.biostars.org/p/182136/

但我对语法并不完全清楚

要连续运行这些,我会这样做:

for i in 1 2 3 4
mv ./blah.exe directory$i
cd directory$i
./blah.exe all
cd ..
end

类似

for i in 1 2 3 4
mv ./blah.sh directory$i
cd directory$i
source ./blah.sh all
cd ..
end

我试图了解如何在一个命令中使用并行将此负载拆分为 4 个逻辑线程。

有人可以为此提供一个例子吗?

感谢您的宝贵时间。

【问题讨论】:

  • 您的脚本是否会影响任何可能使并行化更加困难的共享资源?
  • 如果你想在bash的后台运行一个进程,那么将&附加到命令中。另见en.wikipedia.org/wiki/Job_control_(Unix)
  • Jesper,是的,我可以使用 bash 和 &,但我想编写一个脚本来使用 gno_parallel 进行并行化
  • Reda,据我所知,我用心分配,不会特别辛苦

标签: c++ linux bash parallel-processing gnu-parallel


【解决方案1】:

类似:

parallel --dry-run 'cd directory{}; ../blah.exe all; source ../blah.sh all' ::: {1..4}

无需复制/移动可执行文件,只需运行同一个即可。

之后不需要cd ..,因为每次都是一个新进程。

注意这不是多线程,而是多处理。


如果你想处理不连续的目录号码,你可以使用:

parallel ... ::: {1..4} 6 7 {11..14}

如果要处理所有目录,可以使用:

printf "%s\0" */ | parallel -0 'cd {}; pwd' 

如果你想处理所有以FRED开头的目录,你可以使用:

printf "%s\0" FRED*/ | parallel -0 'cd {}; pwd' 

【讨论】:

  • 谢谢马克。你是对的,这是多处理,抱歉分类错误,我会改变它。这差不多。我还有一个问题要问您:首先,假设我想做 1..4 然后 6,即 11..20,正确的语法是什么?我试过用 1,2,3,4,6,... 另一个是有打印打印输出和日志的选项吗?
  • 我添加了一个不连续目录号码的语法示例。您能否澄清或质疑日志和打印输出?哪些日志和打印输出?他们在哪里?
  • 关于日志,请不要介意。它以某种方式保存在缓存中,通过测试我找到了一种只使用“command >log.log”的方法
  • 但是,我认为这可能违反每个问题一个主题的政策,但我还有一个问题。假设我有大量需要执行“blah.exe”的文件。假设我在“glah.tmp”中有文件名列表,我知道要使用 while 命令
  • 问题是免费的 - 和答案!我认为问另一个可能会更好,因为可能有几种解决方案,而且可能会变得混乱。您可以随时单击原始问题下的share,然后复制超链接并将其粘贴到新问题中以供参考。我会留意一个新问题,我相信 Ole Tange(parallel 的作者)也会看到它,所以你应该很快就会得到回复。
猜你喜欢
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 2011-03-01
相关资源
最近更新 更多