我正在尝试使用bash脚本在Ubuntu 14.04 LTS机器上安排一系列mpi作业。基本上,我希望模拟在每个核心上运行一段时间,然后在该时间过去后终止并继续下一个案例。
当第一个作业结束时mpi退出时,我的问题出现了 - 它打破了循环并将终端返回到我的控件而不是前进到循环的下一个迭代。
我的脚本包含在下面。文件“case_names”只是目录名的文本文件。我已经用其他命令测试了脚本,它可以正常工作,直到我取消注释mpirun调用。
#!/bin/bash
while read line;
do
# Access case dierctory
cd $line
echo "Case $line accessed"
# Start simulation
echo "Case $line starting: $(date)"
mpirun -q -np 8 dsmcFoamPlus -parallel > log.dsmcFoamPlus &
# Wait for 10 hour runtime
sleep 36000
# Kill job
pkill mpirun > /dev/null
echo "Case $line terminated: $(date)"
# Return to parent directory
cd ..
done < case_names
有谁知道如何阻止mpirun像这样打破循环?
到目前为止,我已经尝试过GNOME任务调度程序和任务假脱机程序,但两者都没有工作(可能是由于在我使用的命令可用之前必须调用的别名)。我真的不想诉诸于设置slurm。我还尝试使用disown命令将mpi进程与我正在运行调度脚本的shell分开,甚至编写了一个单独的脚本来杀死调度脚本远程运行的进程。
非常感谢提前!
答案 0 :(得分:0)
我设法找到一种解决方法,允许我按照我想要的方式使用bash脚本安排任务。由于这解决了我的问题,我将其作为答案发布(尽管我仍然欢迎解释为什么mpi在循环中以这种方式表现)。
解决方案在于编写一个单独的脚本来同时调用然后杀死mpi,这本身就是由调度脚本调用的。由于这个子bash进程中没有循环,因此mpi在被杀后没有问题。此外,一旦此脚本退出,调度循环可以继续畅通无阻。
我的(现在正在工作)代码包含在下面。
安排脚本:
while read line;
do
cd $line
echo "CWD: $(pwd)"
echo "Case $line accessed"
bash ../run_job
echo "Case $line terminated: $(date)"
cd ..
done < case_names
执行脚本(run_job):
mpirun -q -np 8 dsmcFoamPlus -parallel > log.dsmcFoamPlus &
echo "Case $line starting: $(date)"
sleep 600
pkill mpirun
我希望有人会觉得这很有用。