首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用flock和cron

使用flock和cron
EN

Server Fault用户
提问于 2016-01-13 22:33:29
回答 2查看 27.6K关注 0票数 10

我需要防止脚本被同时执行多次,所以flock似乎就在我的街道上。

我不知道是否需要在cron作业完成后手动删除锁文件?

我就是这样用的:

代码语言:javascript
复制
# m h dom mon dow user  command
*/20 *  *  *  *  root /usr/bin/flock -w 0 /var/cron.lock /usr/bin/myscript

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

文件已经创建好了,但是我不知道命令是如何知道锁是否被另一个进程持有的。当cron作业被启动时,它是空的,并监视它的更改,没有产生任何结果(使用fuser)。

如果有人能解释它的工作原理,我会非常感激的!

EN

回答 2

Server Fault用户

回答已采纳

发布于 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)。脚本完成后,该文件将不会被删除。

票数 14
EN

Server Fault用户

发布于 2016-01-13 23:53:17

你为什么不能做这样的事:

代码语言:javascript
复制
# m h dom mon dow user  command
*/20 *  *  *  *  root (/usr/bin/pgrep myscript || /usr/bin/myscript)

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

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

票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/748943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档