我正在寻找一个简单而通用的解决方案,它允许您在 crontab 中执行任何脚本或应用程序并防止它运行两次。
解决方案应该独立于执行的命令。
我认为lock && (command ; unlock)如果有另一个锁,它应该看起来像lock 将返回 false 的地方。
第二部分就像它获得了锁,运行命令和在命令执行后解锁,即使它返回错误。
and*_*ing 39
看一下run-one包装。从命令的联机帮助页run-one
:
run-one是一个包装脚本,它运行不超过一个具有一组唯一参数的命令的唯一实例。
这对于 cronjobs 通常很有用,当您希望一次运行不超过一个副本时。
像timeor一样sudo,您只需将其添加到命令中即可。所以一个 cronjob 可能看起来像:
*/60 * * * * run-one rsync -azP $HOME example.com:/srv/backup
Run Code Online (Sandbox Code Playgroud)
有关更多信息和背景,请查看Dustin Kirkland介绍它的博客文章。
设置锁的一种非常简单的方法:
if mkdir /var/lock/mylock; then
echo "Locking succeeded" >&2
else
echo "Lock failed - exit" >&2
exit 1
fi
Run Code Online (Sandbox Code Playgroud)
想要运行的脚本需要创建锁。如果锁存在,则另一个脚本正忙,因此第一个脚本无法运行。如果文件不存在,则没有脚本获得锁定。所以当前脚本获取锁。当脚本完成后,需要通过移除锁来释放锁。
有关 bash 锁的更多信息,请查看此页面