我需要为给定变量名的每个单独实例并行运行一个命令。有时,可能有 4 个变量,有时可能有 100 个。例如,假设我有这个特定的数据集:
datanames='KQPW KMMX KMKO KZAO'
我需要为每个进程运行一个进程,该进程将彼此并行运行。换句话说,我需要为 KQPW 运行 process1,同时为 KMMX 运行 process1,而 ... 等等。 Process1 需要基于变量名的输入。
从我读过的教程和一些初步的挖掘中,我已经安装了 GNU 'parallel' 命令。我已将所有数据名放入名为“run.txt”的文本文件中:
KQPW.csh
KMMX.csh
KMKO.csh
KZAO.csh
其中每个.csh
文件都包含用于调用 process1 的命令,该命令使用唯一的变量名称作为 process1 的必要输入。问题是,我如何一次运行所有这四个命令?我试过了:
cat run.txt | parallel
但什么也没发生。有什么想法吗?
快速演示基于并行描述的执行脚本,无需使用任何外部工具:
执行此操作将显示
waiting..
10 秒延迟,因为所有子 shell 都是并行执行的。wait
将暂停父脚本,直到所有子 shell 都终止,然后再继续。、echo
和语句sleep
在wait
这里用于演示目的。你正在做的应该工作。如果你能做到:
那么 GNU Parallel 也应该能够运行该脚本。第一个调试步骤是用 运行
parallel
,--dry-run
它会告诉你正在运行什么:但是,您的问题中有几件事让我感到困惑:
bash
但您调用您的脚本*.csh
是您的交互式外壳bash
,但脚本csh
- 文件?$PATH
,但是你没有引用带有路径的脚本(例如./KMMX.csh
)。这可以解释为什么它不起作用。尽管您应该收到一条错误消息。chmod +x
这些文件。这可以解释为什么它不起作用。尽管您应该收到一条错误消息。但最重要的是,我担心你对自己做这件事比需要的更难。GNU Parallel 旨在从模板构建命令,听起来好像您的
*.csh
-files 也是从模板构建的,唯一的变化是数据名。我的猜测是您可以将设置更改为:
where
doit
是将数据名作为参数的脚本/函数。我强烈建议您观看介绍视频以进行快速介绍:http ://www.youtube.com/playlist? list=PL284C9FF2488BC6D1 然后查看 OPTIONS 列表后的示例(使用 LESS=+/EXAMPLE: man parallel )。这将使您了解 GNU 并行的能力。然后花几个小时浏览教程(man parallel_tutorial)。
您的命令行会因此而爱上您。