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