结束 mpirun 进程会终止 bash 循环

Posted

技术标签:

【中文标题】结束 mpirun 进程会终止 bash 循环【英文标题】:Ending an mpirun process terminates a bash loop 【发布时间】:2017-08-17 15:02:41 【问题描述】:

我正在尝试使用 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 分开,甚至编写了一个单独的脚本来杀死调度脚本远程运行的进程。

非常感谢!

【问题讨论】:

我想知道你是如何如此关心打破循环,但根本不关心你的模拟结果。这似乎是一种超级不稳定的方式,基本上可以保证你的结果会被破坏。你不能在你的程序中设置超时吗?或forward a user signal 正确终止应用程序。 我使用的代码侧重于对其解决方案的蒙特卡洛变量进行平均,因此随着时间的推移它会收敛到一个单一的解决方案。因此,尽早停止它只会限制最终解决方案的准确性,而不是彻底破坏它。程序中有一个超时选项(我可能最终会使用它),但它仍然以相同的方式终止 mpi。我发布的答案似乎适用于外部终止进程及其内部超时选项。 【参考方案1】:

我设法找到了一种解决方法,它允许我使用我想要的 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

我希望有人会觉得这很有用。

【讨论】:

以上是关于结束 mpirun 进程会终止 bash 循环的主要内容,如果未能解决你的问题,请参考以下文章

Bash - 启动和终止进程

bash脚本编程之for循环及应用

break是终止本次循环还是结束循环

Bash:如何在按下任意键的情况下结束无限循环?

如果没有在一小时内结束,请运行一个进程并将其终止

实验三