每分钟运行一次 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 的风险的主要内容,如果未能解决你的问题,请参考以下文章