perl - Perl-如果系统命令失败或运行时间过长,如何停止它或运行另一个系统调用?

标签 perl error-handling runtime-error system

我有一个Perl脚本,该脚本在某些时间执行许多其他脚本。

这些其他脚本有时可能会永久挂起或完全挂起,但是目前尚无办法判断这些其他脚本是否这样做。

如何实现一种检查脚本运行时间是否太长(以便用户可以采取措施)或彻底失败的方法。可以将计划作为电子邮件发送给适当的用户,通知他们。

下面的系统调用示例:

elsif ($job_type eq 'script') { 
    system("perl $job_dir/$job_args > $work_dir/$job_name.out 2> work_dir/$job_name.err");
}

最佳答案

使用 alarm :

eval {
    local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
    alarm 120;   # 2 Minute timeout

    system("perl $job_dir/$job_args > $work_dir/$job_name.out 2> work_dir/$job_name.err");

    alarm 0;
};
if ($@) {
    die unless $@ eq "alarm\n";   # Propagate unexpected errors

    # Timed out - Send out email to user
    ...

} else {
    # Successfully ran command.  Any cleanup here.
    ...
}

关于perl - Perl-如果系统命令失败或运行时间过长,如何停止它或运行另一个系统调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25547457/

相关文章:

c++ - 制作大表时程序停止工作(2'000' 000+)

c++ - 为什么 catch block 不共享 try block 的范围?

vba - 如何捕获从 VBA 代码启动的 Windows shell 脚本错误?

c - 使用堆将元素插入优先级队列

mysql - 催化剂 DBIx::Class::TimeStamp 设置插入数据库的时间不起作用

regex - 带有花括号内表达式的 Perl 正则表达式无法按预期工作

regex - Perl:查找变量的值是否与数组中的值匹配

perl - 获取权限被拒绝运行 perl 可执行文件

sql - 没有进入 Catch block

java - 在我的小程序中使用 webrenderer 时出现错误