Perl:如何添加中断处理程序,以便通过system()控制mpirun执行的代码?

时间:2010-09-06 17:19:29

标签: linux perl interrupt interrupt-handling openmpi

我们使用带有Perceus(warewulf)软件的集群来进行一些计算。该软件包具有wwmpirun程序(Perl脚本)来准备主机文件并执行mpirun

# ...
system("$mpirun -hostfile $tmp_hostfile -np $mpirun_np @ARGV");
# ...

我们使用这个脚本在几个节点上运行数学程序(CODE),并且通常应该通过Ctrl + C停止CODE,给出一个带有选项的简短菜单:status,stop和halt。但是,使用MPI运行时,按Ctrl + C会导致CODE丢失,导致数据丢失。

CODE的开发人员提出了一种解决方法 - 可以通过创建名为stop%s的文件来停止程序,其中%s是由CODE执行的任务文件的名称。这允许停止,但我们无法获得计算状态。有时需要很长时间才能恢复此功能。

您如何看待 - 问题出在CODE或mpirun

可以找到与mpirun执行的CODE通信的方法吗?

UPDATE1

在单次运行中,输入status,按Ctrl + C并在提供的菜单中选择选项s,即可获得计算状态。 CODE在STDOUT中打印状态信息并继续进行计算。

1 个答案:

答案 0 :(得分:1)

  1. “我们无法获得计算状态” - 这是什么意思?你希望以某种方式获得状态但不是吗?或者该软件不是为了给您提供状态而设计的?

    你的system调用不会在任何地方重新引导标准错误/ out,是应该处于状态的位置(在这种情况下,通过打开管道或重定向到日志来捕获它)让包装器读取日志)。

    此外,您不是通过评估system调用的返回值来处理返回代码 - 这可能是程序通信的另一种方式。

  2. 您的Ctrl + C问题可能是因为Ctrl + C被Perl包装器捕获而不是由具有一些不错的Ctrl + C中断处理程序的CODE而死。解决方案可能是向mpirun添加中断处理程序 - 请参阅Perl Cookbook Recipe 16.18 for $SIG{INT}http://www.wellho.net/resources/ex.php4?item=p216/sigint;您可能希望让Perl包装器捕获Ctrl+C并将INT信号发送到它启动的CODE。