Cronjob – 如何以正确的方式做到这一点



应用程序的一个非常常见的需求是每X分钟/小时运行一次脚本。基本上它并不复杂,只是一些PHP代码和一个crontab条目。

尽管在过去的几年里,我已经写了不少这样的 cronjobs,但我仍然没有看到任何最佳实践,至少没有那么多。与每个"后台处理"一样,很多事情都可能出错,尤其是在生产环境中。

其中:

  • 执行 cron 期间发生错误,脚本在处理一半数据时死亡
  • cronjob被另一个进程意外启动了两次/用户错误/什么
  • cronjob花费的时间比预期的要长,并且脚本再次被调用,尽管它没有完成处理数据
  • 等。

编写坚如磐石、健壮的 cronjob 脚本的最佳实践是什么?编写一个锁定文件,断言只有一个实例运行,在 oder 中进行广泛的日志记录和监控以防止发送数以万计的重复电子邮件?你有什么想法?

就个人而言,我处理错误的方式是简单地将 STDERR 发送到日志文件,然后定期检查该文件。一个简单的方法是将 2>/pathtolog 附加到 crontab 条目。

至于运行同一程序的副本,我更喜欢让脚本尝试锁定某些内容(文件或本地网络端口(。如果无法获取该锁,则脚本不会运行。这样,如果现有脚本当前正在运行,则新脚本无法获取相同的锁。

你可以做很多事情。

根据您的需要,将您的 cron 脚本/二进制文件(我猜是脚本,因为您提到它们是用 PHP 编写的(设置为由所有者或组执行。

如果你想确保它们只由cron执行,那么创建一个cron用户,这是唯一可以执行脚本的用户。然后将该用户设置为在您的 crontab 条目中运行它。

在你的 cron 脚本输出它所做的重要事情。在输出前面加上时间戳/日期戳(取决于它的运行频率(。这使得在日志文件中轻松 grep 特定时间。

通过将脚本的 stdout 附加到 crontab 条目>> /path/cron.log,将脚本的 stdout 附加到日志文件中。

您还可以输出 cronjob 的开始时间和结束时间,以便您可以每隔一段时间分析日志,以确保它不会太慢。

您的日志文件可能如下所示:

[ Tue Feb 20, 2012 ]:
[ Tue Feb 20, 2012 ]: Executing mycron.php
[ Tue Feb 20, 2012 ]: 
[ Tue Feb 20, 2012 ]: Running Query: ""SELECT SUM(`clicks`) FROM `matable`""
[ Tue Feb 20, 2012 ]: Running Query: ""INSERT INTO `History` (`date`, `total_clicks`) VALUES(CURDATE(), 12324123)
[ Tue Feb 20, 2012 ]: 
[ Tue Feb 20, 2012 ]: Finished executing mycron.php. Time taken: 3.462 seconds
[ Tue Feb 21, 2012 ]:
[ Tue Feb 21, 2012 ]: Executing mycron.php
[ Tue Feb 21, 2012 ]: 
[ Tue Feb 21, 2012 ]: Running Query: ""SELECT SUM(`clicks`) FROM `matable`""
[ Tue Feb 21, 2012 ]: Running Query: ""INSERT INTO `History` (`date`, `total_clicks`) VALUES(CURDATE(), 10376123)
[ Tue Feb 21, 2012 ]: 
[ Tue Feb 21, 2012 ]: Finished executing mycron.php. Time taken: 2.998 seconds

当然,除了做它所做的任何事情而不是这两个随机查询。

相关内容

最新更新