使用 flock 和 cron

使用 flock 和 cron

我需要防止一个脚本同时被执行多次,所以这flock似乎很适合我。

我不明白的是,在 cron 作业完成后是否需要手动删除锁定文件?

我是这样使用它的:

# m h dom mon dow user  command
*/20 *  *  *  *  root /usr/bin/flock -w 0 /var/cron.lock /usr/bin/myscript

这个脚本也会在机器启动时由 upstart 执行(这就是竞争条件所在)。

文件创建成功,但我真的不明白命令如何知道锁是否被另一个进程持有。它是空的,当 cron 作业启动时监视它的变化没有任何结果(使用fuser)。

如果有人能解释它是如何工作的我将不胜感激!

答案1

您指定为选项的锁定文件/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)。脚本完成后不会删除该文件。

答案2

您不能做类似的事情的原因是什么:

# m h dom mon dow user  command
*/20 *  *  *  *  root (/usr/bin/pgrep myscript || /usr/bin/myscript)

如果在当前进程快照表中找不到该进程,则返回1并执行/usr/bin/myscript

如果在当前进程快照表中找到该进程,则返回0并停止执行。

相关内容