【问题标题】:Polling mechanism in PerlPerl 中的轮询机制
【发布时间】:2015-05-11 04:41:37
【问题描述】:

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

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

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

有人有什么建议吗?

【问题讨论】:

  • 查看cron的手册页
  • 您可以在主要任务中放置一个钩子,以便它在完成时执行指定的命令。这样就不需要轮询了。
  • 脚本是否将状态存储在文件或数据库或类似的东西中?我想知道在 Perl 中放置一个信号处理程序是否合适。
  • @ratsbane:或者只是一个 END
  • @Borodin 是的,我想我只是不清楚他是否想在工作仍在运行时检查状态。

标签: perl perl-module polling


【解决方案1】:

如果你想在 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 执行完信号处理程序后,它会回到中断前的状态。

【讨论】:

  • 当 SIGUSR1 和 2 形式的“用户空间”有两个非常好的信号时,你为什么要搞乱 SIGIO?
猜你喜欢
  • 2015-04-13
  • 1970-01-01
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
相关资源
最近更新 更多