如何在固定间隔后运行程序代码?

时间:2010-09-12 15:35:24

标签: perl unix cron

我有this Perl script用于监控Linux中的文件夹。

要不断检查目录的任何更新,我有一个在连续循环之间休眠5分钟的while循环:

while(1) {

    ...
    sleep 300;
}

my other question上没有人建议使用cron进行调度而不是for循环。

与使用crontab提交cronjob相比,这个while构造没有任何中断看起来很难看:

0 */5 * * * ./myscript > /dev/null 2>&1
  • cron是正确的选择吗?使用while循环结构有什么好处吗?
  • 除了循环和cron之外,还有更好的方法吗?

另外,我正在使用2.6.9内核版本。

5 个答案:

答案 0 :(得分:5)

我使用while解决方案的唯一原因是,我是否需要每分钟运行一次以上的代码,或者是否需要立即响应外部事件,这两者似乎都不是这里的情况。

我的想法通常是这样的:cron几十年来已被数以百万计的人测试过,所以至少与我刚刚串起来的代码一样可靠

即使在我使用while的情况下,我仍然有一个cron作业,以便在发生故障时重新启动我的脚本。

我的建议是简单地使用cron。这就是它的设计目标。而且,顺便说一句,我很少将输出重定向到/dev/null,这使得调试太难了。通常我只需重定向到/tmp文件系统中的文件,以便我可以看到正在发生的事情。

只要您有自动清理程序,您就可以追加,如果您担心有人在输出中看到任何内容,您甚至可以写入更私密的位置。

然而,最重要的是,如果丢弃输出,则无法分析罕见的故障。如果您认为您的工作没有错误,那么,无论如何都要抛弃输出但我很少考虑我的脚本没有错误,以防万一。

答案 1 :(得分:4)

  1. 为什么不进行将构建放入目录的构建过程进行通知? (请参阅SO 3691739了解其来源!)

  2. cron运行程序是完全可以接受的 - 并且比具有睡眠的永久循环更简单,但不是很多。

  3. 对于cron解决方案,由于这个过程很简单,你无法分辨自上次运行以来发生的变化 - 没有状态。 (或者,更确切地说,如果你提供状态 - 通过文件,可能 - 你的生活比运行一个在内部保持其状态的脚本复杂得多。)

  4. 此外,停止通知服务不太明显。如果有一个进程闲置,你就可以杀死它并停止通知。如果通知由cron运行,那么您必须知道它们已经用完了crontab,知道它的crontab,并编辑该条目以便停止它。

  5. 您还应该考虑说服贵公司升级到可以使用inotify机制的Linux版本。

答案 2 :(得分:1)

如果你选择循环而不是cron并希望你的工作定期运行,那么睡眠(300)往往会漂移。 (考虑脚本其余部分的执行时间)

我建议使用这样的结构:

use constant DELAY => 300;

my $next=time();
while (1){
    $next+=DELAY;

    ...;

    sleep ($next-time());
};

答案 3 :(得分:0)

另一种选择是'anacron'效用。

答案 4 :(得分:0)

如果您不想使用cron。 这个http://upstart.ubuntu.com/可以用来照看过程。 或者你可以使用watch更容易的。