我有一个 rsync 的 cronjob,每 2 分钟运行一次,但有时需要超过 2 分钟的时间。为此,我编写了一个简单的锁定系统来检查,如果找不到文件则写入锁定文件,采取行动并删除该锁定文件。
现在,如果脚本因某种原因崩溃或被杀死,锁定文件将持续存在并导致问题。
确保 cron 任务在某个时候再次运行的好方法是什么?我想过检查锁定文件的年龄,如果超过某个时期就删除它,但我认为应该有更好更优雅的解决方案。
编辑:
我现在已经实施了羊群。我对为什么文件似乎总是存在感到有点困惑,但我发现这个页面通过将 pid 存储在文件信息中来解释它是如何工作的:
http://mattiasgeniar.be/2012/07/24/prevent-cronjobs-from-overlapping-in-linux/
将关键进程的 PID 存储为锁定的一部分,并在再次运行脚本时检查该进程是否仍处于活动状态。
更好的方法是使用锁定目录而不是锁定文件,因为 mkdir 是一个原子操作。您不必检查锁是否存在,如果不存在则创建它,这为其他东西获得锁留下了机会之窗。将关键进程的PID作为文件等放在lock目录下。
在 Linux 上,您可以使用flock实用程序来为您处理所有这一切。
检查进程和锁文件是否存在。如果只有其中一个存在,则说明有问题,必须正确处理。例如,如果锁文件存在且进程未运行,则删除锁文件并继续。
我知道你有自己的锁定系统,但我会用fcron和 exesev(false)