我需要防止脚本被同时执行多次,所以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)。
如果有人能解释它的工作原理,我会非常感激的!
发布于 2016-01-13 23:41:16
指定为/usr/bin/flock的选项的锁文件;在脚本/usr/bin/myscript的持续时间内,/var/cron.lock仍然被flock(2)系统调用锁定。一旦脚本完成,/usr/bin/flock将再次释放该锁。
当/usr/bin/flock命令无法实现锁时,即由于您的脚本仍在运行(或任何其他错误条件),/var/cron.lock已经被锁定,/usr/bin/flock将不会执行您的脚本。您的脚本不需要修改,也不需要对锁进行任何检查,所有这些都是由/usr/bin/flock完成的。
如果锁文件本身还不存在,则由/usr/bin/flock命令将其作为空文件创建,但是在创建锁文件之后,锁文件不会改变,只会应用和删除一个flock(2)。脚本完成后,该文件将不会被删除。
发布于 2016-01-13 23:53:17
你为什么不能做这样的事:
# m h dom mon dow user command
*/20 * * * * root (/usr/bin/pgrep myscript || /usr/bin/myscript)如果在当前流程快照表中找不到进程,则返回1并执行/usr/bin/myscript。
如果进程可以在当前流程快照表中找到,则返回0并停止执行。
https://serverfault.com/questions/748943
复制相似问题