我每天晚上都在非常大的网站上运行PHP scraper。 Crontab在凌晨2点启动脚本,并在早上7点开始播放。现在我担心粗暴地杀死脚本可能会导致数据丢失。假设crontab在脚本忙于将我的已删除数据写入数据库时调用脚本,然后第二天数据库将拒绝该最后/第一条记录,因为它已经存在(即使不完全)。
有什么办法可以用crontab冻结脚本吗? (也就是说,不给我的脚本添加sleep())
答案 0 :(得分:0)
假设crontab在脚本忙于将我的已删除数据写入数据库时调用该脚本
这将是一个问题,因为如果您在外部停止您的流程,您将遇到某些事务超时或某些事情。更好的方法是让脚本自行停止/暂停。例如,您可以定义脚本定期检查的某个标记文件,以便脚本可以以受控方式暂停/暂停。
答案 1 :(得分:0)
有一个不能被打断的大型cronjob通常是设计糟糕的标志,原因有很多。
最值得注意的是,您不能无故地中断运行,否则您最终会损坏数据。如果您遇到意外的断电或服务器崩溃,这可能会成为一个大问题。
此外,无法扩展。如果需要处理更多数据,则无法将其扩展到多个服务器。如果你现在有几个小时的运行时间,你可能很快就会耗尽一台完整的服务器。
我建议认真重新考虑这个cronjob和重组的功能,这样你就可以在某个地方排队等待一些小任务。 (它甚至可以是数据库。)然后,您可以在处理单个任务时屏蔽SIGINT
和SIGTERM
信号,并检查任务之间的接收信号< / em>的。这将允许您使用上述任一方法通知进程并使其正常关闭。
话虽这么说,事情确实破裂,服务器崩溃。我还强烈建议您制定数据恢复计划,以防cronjob在处理某些事情时发生故障。