我正在尝试使用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任务调度程序和任务假脱机程序,但是都没有起作用(可能是由于在使用我的命令可用之前必须先调用别名)。我真的很想不必设置口吃。我还尝试了使用disown命令将mpi进程与正在运行调度脚本的shell分开,甚至编写了一个单独的脚本只是为了杀死远程运行调度脚本的进程。
提前谢谢了!
最佳答案
我设法找到一种解决方法,使我可以按自己的意愿使用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
我希望有人会觉得有用。