如何使用GNU Parallel并行运行多目录下的可执行文件与Bash脚本
用GNU Parallel并行执行多目录任务的示例
首先得提个关键注意点:你原来的串行脚本里用了mv来移动可执行文件,但在并行场景下这么做会出问题——多个进程同时尝试移动同一个文件,只有第一个能成功,剩下的都会找不到文件。所以我们需要调整一下,要么先复制文件到目标目录,要么直接用绝对路径调用原文件(更高效,推荐这个)。
下面是针对你的两个场景的具体实现:
1. 并行运行blah.exe
方案一:复制文件到目标目录执行
这个方案和你原来的逻辑最接近,只是把mv换成cp避免冲突:
# 用4个并行任务处理目录1-4 parallel --jobs 4 'cp ./blah.exe directory{} && cd directory{} && ./blah.exe all' ::: 1 2 3 4
方案二:直接调用原文件(推荐)
如果blah.exe不需要放在目标目录里才能运行,完全可以不用复制,直接切换到目标目录后调用原路径的文件:
# 先获取当前目录的绝对路径(避免相对路径问题) ROOT_DIR=$(pwd) parallel --jobs 4 'cd directory{} && "$ROOT_DIR/blah.exe" all' ::: 1 2 3 4
2. 并行运行blah.sh
同理,针对blah.sh的处理逻辑几乎一样:
方案一:复制脚本到目标目录执行
parallel --jobs 4 'cp ./blah.sh directory{} && cd directory{} && source ./blah.sh all' ::: 1 2 3 4
方案二:直接调用原脚本(推荐)
ROOT_DIR=$(pwd) parallel --jobs 4 'cd directory{} && source "$ROOT_DIR/blah.sh" all' ::: 1 2 3 4
关键语法解释
--jobs 4:指定用4个逻辑线程并行执行,和你要分配的负载数匹配- 单引号包裹的部分:是每个并行任务要执行的命令块,
{}是占位符,会被:::后面的每个参数(1、2、3、4)替换 ::::用来分隔并行任务的命令模板和参数列表- 用
$ROOT_DIR获取绝对路径:避免切换目录后相对路径失效的问题
内容的提问来源于stack exchange,提问作者Sj L
相关产品推荐
相关产品推荐

