我编写了一个Perl脚本,按照计划执行任务。
有时任务运行3小时,有时运行9小时。
任务完成后,任务状态将更改为COMPLETE
。
我们有一个内部CLI命令,用于显示任务的状态。我希望实现一种轮询机制,脚本会定期检查任务的状态,并在状态更改为PASS
后返回COMPLETE
。
一种选择是在循环中运行命令并定期检查状态。我想知道是否还有其他更好或更可靠的方法来定期检查状态。也许在这些方面实施调度程序。
有人有任何建议吗?
答案 0 :(得分:0)
如果要在结束之前检查Perl程序的状态,可以使用signals进行检查。请注意,以下代码非常简单,有很多关于信号和Perl的注意事项,特别是旧版本的Perl。
首先,为要使用的信号定义信号处理函数。如果要引用可能在程序中其他位置使用的任何变量,请确保这些变量在范围内。以下示例使用local来动态范围$ i,以便它可以在USR1信号处理程序中使用:
$SIG{USR1} = sub { print STDOUT "In USR1 signal handler. \$i is $i\n"; };
my $j;
for (local $i = 1; $i < 1000000000; $i++) {
$j = $i*2;
}
然后,每当您想要查询正在运行的进程的状态时,获取PID并向其发送SIGUSR1信号。您可以从另一个程序中执行此操作,但以下示例从命令行显示它:
mb:~ doug$ kill -SIGUSR1 8492
使用上面显示的信号处理程序,当程序收到信号时,它将输出到STDOUT,如下所示:
In USR1 signal handler. $i is 162181697
在Perl执行信号处理程序之后,它将返回到它被中断之前所做的事情。