![编写锁定系统](https://linux22.com/image/593132/%E7%BC%96%E5%86%99%E9%94%81%E5%AE%9A%E7%B3%BB%E7%BB%9F.png)
我有一个 rsync 的 cronjob,每 2 分钟运行一次,但有时需要超过 2 分钟。为此,我编写了一个简单的锁定系统,它会检查,如果找不到文件,则写入锁定文件,采取行动并删除该锁定文件。
现在,如果脚本崩溃或者由于某种原因被终止,那么锁文件将会持续存在并导致问题。
有什么好方法可以确保 cron 任务在某个时间点再次运行?我曾考虑过检查锁文件的使用期限,如果超过一定期限就删除它,但我认为应该有更好、更优雅的解决方案。
編輯:
我现在已经实现了 flock。我有点困惑为什么文件似乎总是存在,但我找到了这个页面,它解释了它的工作原理,通过将 pid 存储在文件信息中:
http://mattiasgeniar.be/2012/07/24/prevent-cronjobs-from-overlapping-in-linux/
答案1
将关键进程的 PID 存储为锁的一部分,当您再次运行脚本时检查该进程是否仍然处于活动状态。
更好的方法是使用锁定目录而不是锁定文件,因为 mkdir 是原子操作。您不必检查锁定是否存在,如果不存在则创建它,这为其他程序获取锁定留下了机会。将关键进程的 PID 作为文件等放在锁定目录中。
在 Linux 上,您可以使用群实用程序可以为您处理所有这些事情。
答案2
检查进程和锁文件存在。如果只有一个存在,则说明存在问题,必须正确处理。例如,如果锁文件存在并且进程未运行,则删除锁文件并继续。
答案3
我知道你有自己的锁定系统,但我会用克隆和 exesev(false)
exesev
boolean(false)
Can a job be executed several times simultaneously ?