You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:28:35