当上一次运行未完成时,如何阻止 cron 作业。它是一个每 5 分钟运行一次的 cron 作业,但有时需要超过 5 分钟才能运行。
编辑 被调用的脚本,有时会崩溃!所以它不能删除锁定文件。
rra*_*nza 14
使用flock(1):
NAME
flock - manage locks from shell scripts
SYNOPSIS
flock [options] <file> -c <command>
flock [options] <directory> -c <command>
flock [options] <file descriptor number>
[...]
Run Code Online (Sandbox Code Playgroud)
您可以阻止它或立即退出。锁定文件的预先存在(或不存在)没有任何区别。如果需要,它会创建文件并使用flock()系统调用来锁定文件。此锁在进程死亡时自动释放。
例如,在 cron 中:
*/5 * * * * /usr/bin/flock /tmp/my.lock /usr/local/bin/myjob
Run Code Online (Sandbox Code Playgroud)
如果您的工作并不总是在 5 分钟内完成,您可以考虑使用--timeout这样您的工作不会排队:
flock --timeout=300
Run Code Online (Sandbox Code Playgroud)
或者用于--nonblock立即退出——它类似于--timeout=0
如果你的脚本是一个 shell 脚本,你可以使用一些聪明的重定向技巧在你的脚本中使用 flock:
(
flock -n 9 || exit 1
# ... commands executed under lock ...
) 9>/var/lock/mylockfile
Run Code Online (Sandbox Code Playgroud)
或者,手册还建议通过将其放在顶部来使您的脚本递归(它使用脚本本身作为其锁定文件):
[ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en "$0" "$0" "$@" || :
Run Code Online (Sandbox Code Playgroud)
有关flock(1)更多信息,请参阅手册页