防止长时间的 cron 作业并行运行的通用解决方案?

sor*_*rin 33 bash cron

我正在寻找一个简单而通用的解决方案,它允许您在 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介绍它的博客文章


Ora*_*Tux 5

设置锁的一种非常简单的方法:

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 锁的更多信息,请查看页面