2

我有以下作业(仅作为示例)在 unix(bash shell)集群计算机中运行:

### job1
mkdir file01
cp *.map  flex01
date > out
cd ..

### job2
mkdir file02
cp *.map  flex02
date > out
cd ..

### job3
mkdir file03
cp *.map  flex03
date > out
cd ..

### job4
mkdir file04
cp *.map  flex04
date > out
cd ..

如果我提交这些工作,我们会一一进行。但我想并行运行它们意味着job1到job4在后台同时运行。

我该怎么做 ?抱歉这个简单的问题,我是 unix 新手。

4

3 回答 3

2

这些cd命令似乎不是一个好主意。你没有cd进入目录。您可能还希望将日期信息附加到输出文件,而不是总是破坏它。您似乎更有可能将地图文件复制到刚刚创建的目录中。所以,你可能会写:

(mkdir flex01; cp *.map flex01; echo "Job 1: $(date)" >> out) &
(mkdir flex02; cp *.map flex02; echo "Job 2: $(date)" >> out) &
(mkdir flex03; cp *.map flex03; echo "Job 3: $(date)" >> out) &
(mkdir flex04; cp *.map flex04; echo "Job 4: $(date)" >> out) &

wait

这会将每个命令序列作为单独的后台作业运行,然后等待它们全部完成后再继续。您也可以考虑使用循环来完成此任务。

for n in $(seq 1 4)
do
    (mkdir flex0$n; cp *.map flex0$n; echo "Job $n: $(date)" >> out) &
done

您也可以考虑使用mkdir -p flex01,以便在尝试创建已存在的目录时不会收到错误消息。(或者您可以测试错误并且如果它存在则不复制,或者在运行之前测试存在mkdir,或者如果它已经存在则在复制之前将其清除,或者......)

于 2012-05-20T03:29:05.163 回答
0

&您只需将 附加到命令行即可启动每个命令并将其置于后台。IE,

date > out &

由于您在单独的目录中启动每个命令,因此对捕获输出的文件使用相同的名称不会有问题。

更新:根据下面评论中提供的其他信息,我相信您的问题出在其他地方,我建议您联系该站点的帮助台和/或查看一些特定于站点的示例脚本文件,以帮助您在对您工作的环境最有效的方法。

于 2012-05-20T02:20:03.190 回答
0

如果你安装了 GNU Parallel http://www.gnu.org/software/parallel/你可以这样做:

seq 4 | parallel 'mkdir flex0{}; cp *.map flex0{}; echo "Job {}: $(date)" >> out'

它将每个 CPU 核心运行一个进程。

您可以通过以下方式安装 GNU Parallel:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem

观看 GNU Parallel 的介绍视频以了解更多信息: https ://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

于 2012-05-22T18:16:44.613 回答