专栏首页性能与架构linux 定时任务crontab防止脚本运行冲突

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

定时任务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中运行一个单独的命令

本文分享自微信公众号 - 性能与架构(yogoup),作者:杜亦舒

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2015-11-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何让linux定时任务crontab按秒执行?

    linux定时任务crontab最小执行时间单位为分钟 如果想以秒为单位执行,应该如何设置呢? 思路 正常情况是在crontab中直接定义要执行的任务,现在...

    dys
  • newSQL 到底是什么?

    互联网在本世纪初开始迅速发展,互联网应用的用户规模、数据量都越来越大,并且要求7X24小时在线。

    dys
  • JS如何实现多线程?

    单线程的问题 javascript是单线程执行的,在处理运算过程中,浏览器不能执行其它javascript脚本,UI渲染线程也会被挂起,从而导致浏览器进入僵死...

    dys
  • PHP反序列化漏洞说明

    PHP程序为了保存和转储对象,提供了序列化的方法,序列化是为了在程序运行的过程中对对象进行转储而产生的。

    徐焱
  • 基于Linux如何搭建Discuz! 论坛

    CrossdayDiscuz! Board(简称 Discuz!)是北京康盛新创科技有限责任公司推出的一套通用的社区论坛软件系统。自2001年6月面世以来,Di...

    JunyouYH
  • 如何基于腾讯云搭建论坛网站(Discuz!)

    CrossdayDiscuz! Board(简称 Discuz!)是北京康盛新创科技有限责任公司推出的一套通用的社区论坛软件系统。自2001年6月面世以来,Di...

    聚优云惠
  • MySQL建表过程中的一些注意事项

    text类型的字段通常用来保存比较大的一些文本对象,除了text,blob类型也经常被使用,这两种类型之间的差别主要是blob能够保存二进制数据,例如图片...

    AsiaYe
  • MOCTF部分Web题攻略

    MOCTF部分Web题解 MOCTF的题目还是比较简单的,今天这篇就当个web类型的入门题吧。本来想把web题解题思路一次全发了,但是篇幅实在是太长了,所以先发...

    天钧
  • 学习了php之后再来看php怎样学java

    静儿
  • 在Ubuntu 18.04上安装WordPress

    WordPress是一个非常流行的专注于博客的动态内容管理系统(CMS)。WordPress可以部署在LAMP或LEMP堆栈上。它具有的可扩展插件框架和主题系统...

    eru

扫码关注云+社区

领取腾讯云代金券