并行运行unix中的作业

时间:2012-05-20 02:18:30

标签: unix loops parallel-processing

我有以下作业(仅作为示例)在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的新手。

3 个答案:

答案 0 :(得分: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之前测试存在,或者在复制之前将其清除,如果它已经存在,或者......)

答案 1 :(得分:0)

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

date > out &

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

<强>更新: 根据评论中提供的其他信息,我相信您的问题出在其他地方,我建议您联系该网站的帮助台和/或查看一些特定于站点的示例脚本文件,以帮助您以最有效的方式设置并行作业适合您所处环境的方式。

答案 2 :(得分: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