每分钟运行一次 cronjob 的风险

Posted

技术标签:

【中文标题】每分钟运行一次 cronjob 的风险【英文标题】:Risks of running a cronjob every minute 【发布时间】:2018-05-28 15:52:24 【问题描述】:

我有一个 php 脚本,用于检查某个文件夹中的 xml 文件,然后将每个文件中的信息导入 mysql 数据库。

我想设置一个 cronjob 以每分钟运行一次,这样每当添加新文件时,它们几乎会立即被导入,而无需我手动 ssh 并运行脚本。

我有一个 if 语句检查文件是否存在,如果存在则只运行代码,否则会回显“无文件”。

我想知道持续运行是否有任何风险,是否会占用过多的资源?等等

【问题讨论】:

那个 cron 的持续时间是多少? 我读“每一分钟”@AnupYadav 应该没有任何风险。 唯一真正的风险可能是如果脚本花费的时间超过一分钟,它可能会多次处理同一个文件。只需添加一个检查,就可以了,具体取决于脚本。 如果作业挂起然后 cron 尝试一次又一次地运行脚本,则存在风险...... 【参考方案1】:

每分钟运行一个进程真的没有任何错误...除了常见的陷阱 [我将其包括在缓解方法中]。我确实想说,对于现代计算机来说,一分钟真的很长。如果您的周期不足,那么每分钟执行几个额外的系统调用是错误的地方。

陷阱#1 是脚本出现“错误”,并且由于某种原因它没有退出。症状:盒子崩溃,因为它无法再创建进程和/或打开文件描述符等。

解决方法:让脚本获取文件的独占锁。您可以将您的 pid 写入文件,但这很麻烦。如果抢不到排他锁,说明之前的版本正在运行,退出即可。

flock() 的 PHP 接口如下:PHP flock()

陷阱#2:它确实应该是一个守护进程。

如果某件事需要“一直做”,也许它真的应该“一直做”。您可以使用文件锁定配方来确保您的脚本保持正常运行,或者您可以使用诸如 monit 之类的东西来启动它。但是您也可以通过使用 cron 和文件锁定来确保它保持正常运行。

陷阱#3:你转换为一个守护进程,但存在内存泄漏,并且事情不断扩大,就像《威利旺卡》中的女孩吃太多蓝莓。症状:OOM错误,swaping等。这毕竟是PHP。

解决方案:在 1000 [或一些 #] 次迭代后退出,然后使用 cron 和文件锁定模型启动新版本 [或 monit 或等效]。

【讨论】:

以上是关于每分钟运行一次 cronjob 的风险的主要内容,如果未能解决你的问题,请参考以下文章

如何每 X 分钟运行一次 cronjob?

如何每分钟更频繁地运行 Cronjobs?

每分钟 Cronjob

Crontab 每 15 分钟运行一次,除了凌晨 3 点?

每 5 分钟运行一次 Cron 作业,持续 10 秒

Laravel 4 CronJob 继续运行