我有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
另外,我正在使用2.6.9内核版本。
答案 0 :(得分:5)
我使用while
解决方案的唯一原因是,我是否需要每分钟运行一次以上的代码,或者是否需要立即响应外部事件,这两者似乎都不是这里的情况。
我的想法通常是这样的:cron
几十年来已被数以百万计的人测试过,所以至少与我刚刚串起来的代码一样可靠
即使在我使用while
的情况下,我仍然有一个cron
作业,以便在发生故障时重新启动我的脚本。
我的建议是简单地使用cron
。这就是它的设计目标。而且,顺便说一句,我很少将输出重定向到/dev/null
,这使得调试太难了。通常我只需重定向到/tmp
文件系统中的文件,以便我可以看到正在发生的事情。
只要您有自动清理程序,您就可以追加,如果您担心有人在输出中看到任何内容,您甚至可以写入更私密的位置。
然而,最重要的是,如果丢弃输出,则无法分析罕见的故障。如果您认为您的工作没有错误,那么,无论如何都要抛弃输出但我很少考虑我的脚本没有错误,以防万一。
答案 1 :(得分:4)
为什么不进行将构建放入目录的构建过程进行通知? (请参阅SO 3691739了解其来源!)
让cron
运行程序是完全可以接受的 - 并且比具有睡眠的永久循环更简单,但不是很多。
对于cron解决方案,由于这个过程很简单,你无法分辨自上次运行以来发生的变化 - 没有状态。 (或者,更确切地说,如果你提供状态 - 通过文件,可能 - 你的生活比运行一个在内部保持其状态的脚本复杂得多。)
此外,停止通知服务不太明显。如果有一个进程闲置,你就可以杀死它并停止通知。如果通知由cron
运行,那么您必须知道它们已经用完了crontab,知道它的crontab,并编辑该条目以便停止它。
您还应该考虑说服贵公司升级到可以使用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更容易的。