Perl中的轮询机制

时间:2015-03-09 21:18:59

标签: perl perl-module polling

我编写了一个Perl脚本,按照计划执行任务。 有时任务运行3小时,有时运行9小时。 任务完成后,任务状态将更改为COMPLETE

我们有一个内部CLI命令,用于显示任务的状态。我希望实现一种轮询机制,脚本会定期检查任务的状态,并在状态更改为PASS后返回COMPLETE

一种选择是在循环中运行命令并定期检查状态。我想知道是否还有其他更好或更可靠的方法来定期检查状态。也许在这些方面实施调度程序。

有人有任何建议吗?

1 个答案:

答案 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执行信号处理程序之后,它将返回到它被中断之前所做的事情。