没有内核 SIG 的 Perl alarm() 或 Time::Out

Perl alarm() or Time::Out Without Kernel SIG

我有一个脚本在与网络服务器通信时偶尔会出现异常。服务器挂起或数据响应速度很慢。

我目前正在使用 alarm() 作为让脚本终止的 hack——以免系统中充满线程——但这会导致 cron 错误,它会提醒系统管理员,而系统管理员实际上并没有不想要系统崩溃时产生的 200 封电子邮件。

是否有替代方法终止脚本(或 apiQuery,如果需要),不会导致非正常退出和相应的电子邮件?

您可以在信号处理程序中抛出异常,然后在别处捕获它。

my $success = eval {
    local $SIG{ALRM} = sub { die "Failure" };
    alarm 10;
    do_something_long();
    alarm 0;
    1;
};
if (!$success) {
    warn "Timeout!\n" if $verbose;
    exit 0;
}