写一个锁系统

dat*_*vil 3 cron

我有一个 rsync 的 cronjob,它每 2 分钟运行一次,但有时需要超过 2 分钟。为此,我编写了一个简单的锁定系统,该系统检查如果找不到文件则写入锁定文件,采取行动并删除该锁定文件。

现在,如果脚本由于某种原因崩溃或被杀死,则锁定文件将持续存在并导致问题。

确保 cron 任务在某个时候再次运行的好方法是什么?我曾想过检查锁文件的年龄并在超过一定时期后将其删除,但我认为应该有更好更优雅的解决方案。

编辑:

我现在已经实现了flock。我对为什么文件似乎总是存在感到有些困惑,但我发现这个页面通过将 pid 存储在文件信息中来解释它是如何工作的:

http://mattiasgeniar.be/2012/07/24/prevent-cronjobs-from-overlapping-in-linux/

use*_*517 5

将关键进程的 PID 存储为锁的一部分,并在您再次运行脚本时检查该进程是否仍处于活动状态。

更好的方法是使用锁定目录而不是锁定文件,因为 mkdir 是原子操作。您不必检查锁是否存在,如果不存在则创建它,这为其他人获得锁留下了机会。将关键进程的PID作为文件等放在锁定目录中。

在 Linux 上,您可以使用flock实用程序为您处理所有这些。