我有以下作业(仅作为示例)在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新手。
最佳答案
cd
命令似乎不是一个好主意;您不需要cd
进入目录。您可能还想将日期信息附加到输出文件中,而不是总是破坏它。您似乎更有可能将 map 文件复制到刚刚创建的目录中。所以,你可能会写:
(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
之前测试是否存在,或者如果它已经存在,则在复制之前将其清除,或者...)
关于unix - UNIX 中作业的并行运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10670285/