Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何在固定的时间间隔后运行程序代码?_Perl_Unix_Cron - Fatal编程技术网

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

Perl 如何在固定的时间间隔后运行程序代码?,perl,unix,cron,Perl,Unix,Cron,我有一个在Linux中监视文件夹的工具 为了持续检查目录的任何更新,我有一个while循环,在连续循环之间休眠5分钟: while(1) { ... sleep 300; } 上没有人建议使用cron进行调度,而不是for循环 与使用以下方法提交cronjob相比,这个while构造(没有任何中断)在我看来很难看: cron是正确的选择吗?使用while循环构造有什么好处吗? 除了循环和cron之外,还有其他更好的方法吗? 另外,我使用的是2.6.9内核版本。我使用while

我有一个在Linux中监视文件夹的工具

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

while(1) {

    ...
    sleep 300;
}
上没有人建议使用cron进行调度,而不是for循环

与使用以下方法提交cronjob相比,这个while构造(没有任何中断)在我看来很难看:

cron是正确的选择吗?使用while循环构造有什么好处吗? 除了循环和cron之外,还有其他更好的方法吗?
另外,我使用的是2.6.9内核版本。

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

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

即使在我已经使用了一段时间的情况下,我仍然有一个cron作业来重新启动脚本以防失败

我的建议是简单地使用cron。这就是它的设计目的。另外,我很少将输出重定向到/dev/null,这使得调试变得太困难。通常,我只是重定向到/tmp文件系统中的一个文件,以便查看发生了什么

只要你有一个自动的清理过程,你就可以添加,如果你担心有人看到输出中的东西,你甚至可以写到一个更私密的地方


不过,底线是,如果你丢掉了输出,那么就无法分析罕见的故障。如果你认为你的工作是无bug的,那么,无论如何,扔掉输出,但我很少考虑我的脚本是免费的,以防万一。

< P>我曾经使用过while解决方案的唯一原因是,如果我需要我的代码每分钟运行一次以上,或者如果它需要立即响应外部事件,这里的情况似乎都不是这样

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

即使在我已经使用了一段时间的情况下,我仍然有一个cron作业来重新启动脚本以防失败

我的建议是简单地使用cron。这就是它的设计目的。另外,我很少将输出重定向到/dev/null,这使得调试变得太困难。通常,我只是重定向到/tmp文件系统中的一个文件,以便查看发生了什么

只要你有一个自动的清理过程,你就可以添加,如果你担心有人看到输出中的东西,你甚至可以写到一个更私密的地方

不过,底线是,如果你丢掉了输出,那么就无法分析罕见的故障。如果你认为你的工作是无bug的,那么,一定要扔掉输出,但是我很少考虑我的脚本是免费的,以防万一。 为什么不让将构建放入目录的构建过程执行通知?看看这是从哪里来的

让cron运行这个程序是完全可以接受的,而且比一个带睡眠的永久循环要简单,尽管不是很多

对于cron解决方案,由于该过程是一个简单的一次性过程,您无法判断自上次运行以来发生了什么变化-没有状态。或者,更准确地说,如果你通过一个文件提供状态,你的生活可能比运行一个保持其内部状态的脚本复杂得多

此外,停止通知服务也不太明显。如果有一个进程悬而未决,那么您将杀死它并停止通知。如果通知由cron运行,那么您必须知道它们已用完crontab,知道它是谁的crontab,并编辑该条目以停止它

<> P>你也应该考虑说服你的公司升级到一个Linux版本,那里有iCyType机制。 为什么不让将构建放入目录的构建过程执行通知?看看这是从哪里来的

让cron运行这个程序是完全可以接受的,而且比一个带睡眠的永久循环要简单,尽管不是很多

对于cron解决方案,由于该过程是一个简单的一次性过程,您无法判断自上次运行以来发生了什么变化-没有状态。或者,更准确地说,如果你通过一个文件提供状态,你的生活可能比运行一个保持其内部状态的脚本复杂得多

此外,停止通知服务也不太明显。如果有一个进程悬而未决,那么您将杀死它并停止通知。如果通知由cron运行,那么您必须知道它们已用完crontab,知道它是谁的crontab,并按顺序编辑该条目 我们必须阻止它

<> P>你也应该考虑说服你的公司升级到一个Linux版本,那里有iCyType机制。
如果您使用循环而不是cron,并且希望定期运行作业,那么sleep300会出现漂移。考虑脚本

其余部分的执行时间。 我建议使用如下构造:

use constant DELAY => 300;

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

    ...;

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

如果您使用循环而不是cron,并且希望定期运行作业,那么sleep300会出现漂移。考虑脚本

其余部分的执行时间。 我建议使用如下构造:

use constant DELAY => 300;

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

    ...;

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

另一种选择是“anacron”实用程序。

另一种选择是“anacron”实用程序。

如果您不想使用cron。 这可用于婴儿看护过程。 或者,如果不想使用cron,可以使用更简单的方法。

。 这可用于婴儿看护过程。
或者,您可以使用更简单的选项。

+1用于“不要丢弃程序试图报告的错误”部分。通过在脚本运行之前引入延迟,您可以让cron以每秒一次以上的速度运行作业。例如,要让foo.sh每秒运行四次,你可以说:****foo.sh,****sleep.25;foo.sh,******sleep.5;foo.sh和*****sleep.75;foo.sh.@Chas。Owens-cron的分辨率是每分钟一次,而不是每秒钟一次。当然,您的sleep解决方案仍然适用于此。您还可以将作业的输出转储到logger1,logger1将其转储到您配置的任何系统日志文件中,并且这些日志将由系统使用的任何日志旋转器维护。尝试yourscriptname | logger-t yourscriptname。当处理长期运行时,while方法也很有用,并且您不想冒并发调用脚本导致混乱的风险。这至少是你必须考虑的问题。此外,在某些情况下,让脚本在未来一段时间内处于自身状态而不是休眠状态可能是有益的。+1表示“不要扔掉程序试图报告的错误”部分。通过在脚本运行之前引入延迟,可以让cron以每秒一次以上的速度运行作业。例如,要让foo.sh每秒运行四次,你可以说:****foo.sh,****sleep.25;foo.sh,******sleep.5;foo.sh和*****sleep.75;foo.sh.@Chas。Owens-cron的分辨率是每分钟一次,而不是每秒钟一次。当然,您的sleep解决方案仍然适用于此。您还可以将作业的输出转储到logger1,logger1将其转储到您配置的任何系统日志文件中,并且这些日志将由系统使用的任何日志旋转器维护。尝试yourscriptname | logger-t yourscriptname。当处理长期运行时,while方法也很有用,并且您不想冒并发调用脚本导致混乱的风险。这至少是你必须考虑的问题。在某些情况下,让脚本在未来一段时间内独立运行,而不是沉睡是有益的。1构建过程是单独处理的,几乎超出了我的控制范围。3实际上存在一种状态,即缓存文件存储上次更改的时间戳。感谢您提到,在使用cron时,我不能在程序中使用状态。1构建过程是单独处理的,几乎超出了我的控制范围。3实际上存在一种状态,即缓存文件存储上次发生更改的时间戳。感谢您提到,在使用cron时,我不能在程序中使用状态。如果循环在需要301、302、303、。。。秒而不是300秒?既然在“构建”到达和被发现之间已经有一个不确定但有界的300秒延迟,那么再过一两秒会有什么实际的区别吗?@Jonathan:不,那没有什么区别。300秒只是为了避免检查太频繁,避免一次更新发送10封邮件如果循环正在运行并且添加了10个文件,它可能会精确地检查每个文件的添加时间,并分别发送每个文件的邮件,这不是我想要的。如果循环在需要301、302、303、。。。秒而不是300秒?既然在“构建”到达和被发现之间已经有一个不确定但有界的300秒延迟,那么再过一两秒会有什么实际的区别吗?@Jonathan:不,那没有什么区别。300秒只是为了避免检查太频繁,避免一次更新发送10封邮件如果循环正在运行并且添加了10个文件,它可能会精确地检查每个文件的添加时间,并分别为每个文件发送邮件,这不是我想要的。