没有内核 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;
}
我有一个脚本在与网络服务器通信时偶尔会出现异常。服务器挂起或数据响应速度很慢。
我目前正在使用 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;
}