我需要为给定变量名的每个单独实例并行运行命令。有时,可能有 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 都终止后再继续。echo
、sleep
和语句wait
在此用于演示目的。
答案2
你正在做的事情应该有效。如果你能做到:
$ KMMX.csh
那么 GNU Parallel 也应该能够运行该脚本。第一个调试步骤是运行parallel
with --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)。
您的命令行会因此而喜欢您。