我们使用带有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通信的方法吗?
在单次运行中,输入status
,按Ctrl + C并在提供的菜单中选择选项s
,即可获得计算状态。 CODE在STDOUT中打印状态信息并继续进行计算。
答案 0 :(得分:1)
“我们无法获得计算状态” - 这是什么意思?你希望以某种方式获得状态但不是吗?或者该软件不是为了给您提供状态而设计的?
你的system
调用不会在任何地方重新引导标准错误/ out,是应该处于状态的位置(在这种情况下,通过打开管道或重定向到日志来捕获它)让包装器读取日志)。
此外,您不是通过评估system
调用的返回值来处理返回代码 - 这可能是程序通信的另一种方式。
您的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。