0

我每天晚上在一个非常大的网站上运行一个 PHP 刮板。Crontab 在凌晨 2 点启动脚本,并在早上 7 点将其杀死。现在我担心残酷地杀死脚本可能会导致数据丢失。假设 crontab 在脚本忙于将我抓取的数据写入数据库时​​关闭脚本,那么第二天数据库将拒绝最后/第一条记录,因为它已经存在(即使不完全存在)。

有什么办法可以用 crontab 冻结脚本吗?(也就是说,没有在我的脚本中添加 sleep() )

4

2 回答 2

0

假设 crontab 在脚本忙于将我抓取的数据写入数据库时​​关闭脚本

这将是一个问题,因为如果您在外部停止进程,您将遇到一些事务超时或其他问题。更好的方法是让脚本自行停止/暂停。例如,您可以定义一些由脚本定期检查的标记文件,以便脚本可以以受控方式暂停/暂停。

于 2013-05-16T07:39:37.473 回答
0

由于多种原因,拥有一个无法中断的大型 cronjob 通常是糟糕设计的标志。

最值得注意的是,您不能无缘无故地中断运行,否则您最终会得到损坏的数据。如果您遇到意外断电服务器崩溃,这可能会成为一个大问题。

此外,它不缩放。如果您需要处理更多数据,则无法将其扩展到多台服务器。如果您现在有几个小时的运行时间,您可能很快就会耗尽整个服务器。

我建议认真重新考虑此 cronjob 的功能并对其进行重组,以便您有许多较小的任务在某处排队。(它甚至可以是数据库。)然后,您可以在处理单个任务时屏蔽SIGINTSIGTERM信号,并检查任务之间接收到的信号。这将允许您使用上述任一方法通知进程并使其正常关闭。

话虽这么说,事情确实会崩溃,服务器也会崩溃。我还敦促您制定数据恢复计划,以防 cronjob 在处理某事时发生故障。

于 2013-05-16T08:29:17.643 回答