前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >linux 定时任务crontab防止脚本运行冲突

linux 定时任务crontab防止脚本运行冲突

作者头像
dys
发布2018-04-03 11:44:05
3.6K0
发布2018-04-03 11:44:05
举报
文章被收录于专栏:性能与架构性能与架构

定时任务crontab是linux下常用的功能,可以设置一定的间隔时间执行任务,但有可能出现任务脚本运行冲突问题 例如某脚本要运行30分钟,在crontab里设为每40分钟执行一次,而比较糟的情况是可能该脚本在执行周期内没有完成,接着第二个脚本又开始运行了 示例 做一个实验来模拟这个情况 (1)用自己熟悉的语言来写一个程序,做一个循环,例如循环180次,循环体中随意打印一些信息,然后sleep一秒,意思就是让这个程序执行3分钟 我用php实现的,名字为 test.php (2)编辑 crontab 添加一个定时任务,设置为一分钟执行一次上面的程序,我的设置为 * * * * * php /root/test.php >> /root/test.log 因为程序循环中有打印的信息,所以指定了一个日志文件,用来方便查看程序是否运行 (3)等待一分钟,查看进程信息 # ps aux | grep test.php 可以看到出现了一个test.php的进程 再等一分钟,再次执行此命令,可以看到又出现了一个test.php进程 这就说明这个定时任务脚本已经重复执行了,如果业务逻辑是不允许重复执行,这就出现了冲突 如何确保只有一个脚本实例运行呢? 解决方法 使用linux flock 文件锁实现任务锁定,解决冲突 现在把定时任务改为这样(把test.php改为testflock.php,便于查看清晰) * * * * * flock -xn /tmp/mytest.lock -c 'php /root/testflock.php >> /root/test.log' 等待一会儿,再执行查看进程的命令,多次查看后,会发现始终只有一个 testflock.php 进程 flock说明 使用flock的意义就是每次执行任务时先去获取文件独占锁,成功取到锁,就继续执行,否则放弃执行 例如第一个任务可以取得锁,开始执行,执行完成后,解锁,第二个任务开始时先去取锁,如果第一个任务还没执行完,则取锁失败,不再继续执行任务 这样就防止了运行冲突 上面例子中用到了flock的3个参数 -x, --exclusive: 获得一个独占锁 -n, --nonblock: 如果没有立即获得锁,直接失败而不是等待

-c, --command: 在shell中运行一个单独的命令

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2015-11-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JAVA高性能架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档