从Perl中杀死现有/正在运行的程序Matlab

时间:2014-09-01 09:53:29

标签: perl matlab

我有一个脚本调用某些matlab程序或perl脚本在某些时候使用以下命令运行:

MATLAB

system('matlab', '-nosplash', '-nodisplay', '-nodesktop', '-wait', '-logfile', "$workDir/$job_name.log",  '-r', "$job_args;exit");

PERL

system("perl $jobDir/$job_args > $workDir/$job_name.out 2> $workDir/$job_name.err");

然后我有一些代码封装了上面的命令(每个命令在不同的脚本中运行),如果脚本运行超过2小时或者无法运行/发生错误,它会使用警报来终止脚本。

问题是杀死正在运行的matlab进程似乎非常困难。如果一个m文件遇到错误,它就会挂在那里,永远不会完成或转到'退出'。仍然达到2小时的限制,但它只是继续。 Die似乎没有杀死实际的matlab脚本。

在Perl脚本中,有两种方法可以在2小时后杀死正在运行的matlab脚本,或者在执行过程中是否发生错误?

脚本周围的代码示例如下:

eval{
        local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
        alarm 7200;   # 2 hour timeout
        my $test = system('matlab', '-nosplash', '-nodisplay', '-nodesktop', '-wait', '-logfile', "$workDir/$job_name.log",  '-r', "$job_args;exit");
        #Run matlab with nosplash screen or matlab instance. -wait forces the script to pause until the matlab program completes. Logfile is writte to NAME.log, after prog completes, matlab closes.
        if ($test != 0) {
        die "Failed to run";
        print "$job_name failed: $?>>8";
        exec("perl", "$scriptDir/msched_result.pl", "$job_name", "FAILED", "$start_time");      #print argsfile output to .out and error to .err.
        }
        alarm 0;
        };
        if ($@) {
            die unless $@ eq "alarm\n";   # Propagate unexpected errors
            exec("perl", "$scriptDir/msched_result.pl", "$job_name", "TIMED OUT", "$start_time")
        } else {
            exec("perl", "$scriptDir/msched_result.pl", "$job_name", "DONE", "$start_time");    #run msched_result
        }

由于

1 个答案:

答案 0 :(得分:0)

如果有人遇到类似的问题,那么杀死带有错误的matlab文件的解决方案是通过以某种方式调用该文件来预先预防它。

而不是我的第一个例子:

system('matlab', '-nosplash', '-nodisplay', '-nodesktop', '-wait', '-logfile', "$workDir/$job_name.log",  '-r', "$job_args;exit");

尝试

system('matlab', '-nosplash', '-nodisplay', '-nodesktop', '-wait', '-logfile', "$workDir/$job_name.log",  '-r', "try,$job_args,catch,exit(1),end,exit(0)");

因此,无论运行参数时是否存在错误,matlab都将关闭,根据是否发生错误返回1或0。

可选地

`taskkill /F /IM matlab.exe 2>&1`;

将杀死所有matlab实例,但这是非常强大的力量。