我用 cron 运行一个脚本:
*/10 * * * * flock -n /tmp/lock script
我必须确保该脚本只有一个实例同时运行,为此,我使用了flock。问题是,有时这个脚本会启动一个守护进程,在这种情况下,守护进程会阻止以下脚本的执行。
我知道一个可能的解决方案是在脚本末尾解锁文件,但是是否可以直接在 cron 命令中执行此操作?
答案1
看来你想让你的守护进程通过 cron 运行。如果是的话,这不是一个好主意。为什么这个羊群有时会失败?您使用 /tmp 目录。也许另一个进程删除了旧文件。完成后,flock仍保留已flock但已删除的文件。在另一个 10 分钟的 cron 轮中,另一个集群实例没有看到这个文件,创建另一个并运行不需要的重复文件。解决方案,将锁定文件移动到 /var/run 目录或其他位置。如果您的守护进程经常结束工作,请考虑退出代码。为信号 INT15 分配一些退出代码。从某个“无限”循环运行您的守护进程一。这个循环应该检测到,你的守护进程被 sig15 或其他杀死。当其他时,只需执行另一个循环。如果是 15,则离开循环并结束守护进程。您可以使用 runsv 软件包,在 debian 和 redhat 下可用。它的工作方式与 cron 完全不同。它运行您的脚本/守护程序可执行文件并等待其完成或崩溃。当它出现时,重新启动它。然后你就不必担心运行两次代码,并且你可以用 cron 结束游戏,因为 cron 不适合这项工作。