我需要防止脚本同时执行多次,所以flock
看起来就在我的街上。
我想不通的是,我是否需要在完成 cron 作业后手动删除锁定文件?
我是这样使用它的:
# m h dom mon dow user command
*/20 * * * * root /usr/bin/flock -w 0 /var/cron.lock /usr/bin/myscript
Run Code Online (Sandbox Code Playgroud)
这个脚本也由 upstart 在机器启动时执行(这是竞争条件所在)。
文件创建正常,但我真的看不到命令如何知道锁是否被另一个进程持有。它是空的,并且在启动 cron 作业时监视它的更改不会产生任何结果(使用fuser
)。
如果有人可以解释它是如何工作的,我将不胜感激!
HBr*_*ijn 12
您指定为选项的锁定文件/usr/bin/flock
;在脚本运行期间/var/cron.lock
保持flock(2)
系统调用锁定/usr/bin/myscript
。一旦您的脚本完成,该锁将再次由/usr/bin/flock
.
当/usr/bin/flock
命令无法获得锁定时,即因为/var/cron.lock
您的脚本仍在运行(或任何其他错误情况)而已被锁定, /usr/bin/flock 将不会执行您的脚本。你的脚本不需要修改,也不需要对锁做任何检查,这一切都由 /usr/bin/flock 完成。
如果锁文件本身/usr/bin/flock
不存在,则该命令将创建为空文件,但在创建后锁文件不会更改,只会应用和删除 flock(2)。脚本完成后不会删除该文件。