并行运行多个具有不同名称的 bash 脚本

并行运行多个具有不同名称的 bash 脚本

我需要为给定变量名的每个单独实例并行运行命令。有时,可能有 4 个变量,有时可能有 100 个。例如,假设我有这个特定的数据集:

datanames='KQPW KMMX KMKO KZAO'

我需要为每个进程运行一个进程,该进程将彼此并行运行。换句话说,我需要为 KQPW 运行 process1,同时为 KMMX 运行 process1 while ... 等等。Process1 需要基于变量名的输入。

从我读过的教程和一些初步的挖掘中,我已经安装了 GNU 'parallel' 命令。我已将所有数据名放入名为“run.txt”的文本文件中:

KQPW.csh
KMMX.csh
KMKO.csh
KZAO.csh

其中每个.csh文件都包含调用 process1 的命令,并使用唯一的变量名称作为 process1 的必要输入。问题是,如何同时运行这四个命令?我试过:

cat run.txt | parallel

但什么也没发生。有什么想法吗?

答案1

快速演示基于并行描述的执行脚本,无需使用任何外部工具:

#!/bin/bash
datanames='KQPW KMMX KMKO KZAO'
datanamesarray=($datanames)
for item in ${datanamesarray[@]}; do
  ( ./${item}.csh; sleep 10 ) &
done
echo waiting..
wait
echo done

执行此命令waiting..后将显示十秒的延迟,因为所有子 shell 都是并行执行的。 wait将暂停父脚本,直到所有子 shell 都终止后再继续。echosleep和语句wait在此用于演示目的。

答案2

你正在做的事情应该有效。如果你能做到:

$ KMMX.csh

那么 GNU Parallel 也应该能够运行该脚本。第一个调试步骤是运行parallelwith --dry-run,它会告诉您正在运行什么:

cat run.txt | parallel --dry-run

不过,你的问题中有几个地方让我很困惑:

  • 问题的标题提到bash但你称你的脚本*.csh是你的交互式外壳bash但脚本文件csh吗?
  • 您没有提到您已将文件放入 中的目录中$PATH,但您没有使用路径引用脚本(例如./KMMX.csh)。这可以解释为什么它不起作用。尽管您应该收到一条错误消息。
  • 您没有提到您拥有chmod +x这些文件。这可以解释为什么它不起作用。尽管您应该收到一条错误消息。

但最重要的是,我担心你对自己做的事情比需要的更加困难。 GNU Parallel 旨在从模板构建命令,听起来好像您的*.csh文件也是从模板构建的,唯一的变化是数据名。

我的猜测是你可以将你的设置更改为:

$ parallel doit {} ::: KQPW KMMX KMKO KZAO

其中doit是将数据名作为参数的脚本/函数。

我强烈建议您观看介绍视频以进行快速介绍:http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1然后查看选项列表后的示例(使用 LESS=+/EXAMPLE:man parallel)。这将使您了解 GNU 并行的能力。然后花几个小时浏览本教程 (man parallel_tutorial)。

您的命令行会因此而喜欢您。

相关内容