linux的crontab命令,可以定时执行操作,最小周期是每分钟执行一次。关于crontab实现每秒执行可参考我之前的文章《linux crontab 实现每秒执行》

现在有个问题,如果设定了任务每分钟执行一次,但有可能一分钟内任务并没有执行完成,这时系统会再执行任务。导致两个相同的任务在执行。

例如:

<?
// test.php
for($i=0; $i<300; $i++){
    echo date('Y-m-d H:i:s')."\r\n";
    sleep(1);
}
?>
循环300次,每循环一次睡眠1秒。执行完成需要300秒即5分钟。
设置crontab 为每分钟执行

* * * * * php /home/fdipzone/php/test.php >> /home/fdipzone/php/test.log
2分钟后,使用 ps aux|grep test.php 查看,可以看到有两个test.php进程在执行。
3分钟后,看到有3个test.php进程在执行。

fdipzone@ubuntu:/tmp$ ps aux|grep test.php
fdipzone  2995  0.0  0.0   4220   588 ?        Ss   00:28   0:00 /bin/sh -c php /home/fdipzone/php/test.php >> /home/fdipzone/php/test.log
fdipzone  2996  0.0  0.8 108328  8564 ?        S    00:28   0:00 php /home/fdipzone/php/test.php
fdipzone  3033  0.0  0.0   4220   584 ?        Ss   00:29   0:00 /bin/sh -c php /home/fdipzone/php/test.php >> /home/fdipzone/php/test.log
fdipzone  3034  0.1  0.8 108328  8564 ?        S    00:29   0:00 php /home/fdipzone/php/test.php
fdipzone  3047  0.0  0.0   4220   588 ?        Ss   00:30   0:00 /bin/sh -c php /home/fdipzone/php/test.php >> /home/fdipzone/php/test.log
fdipzone  3048  1.3  0.8 108328  8560 ?        S    00:30   0:00 php /home/fdipzone/php/test.php
fdipzone  3051  0.0  0.1  13148  1068 pts/0    S+   00:30   0:00 grep --color=auto test.php
我们是希望执行完上一任务,再执行下一任务,如果上一任务未执行完成,则这次的任务不执行,直到下一周期再判断,如果上一任务执行完成,则可以执行下一任务。

改进方法

我们可以使用一个锁文件,来记录任务是否执行中。

首先判断/tmp/mytest.lock是否存在,如果不存在,则创建,然后执行任务,任务执行完后删除锁文件。

如果锁文件已经存在,则退出这次的任务。

<?php
$lockfile = '/tmp/mytest.lock';
 
if(file_exists($lockfile)){
    exit();
}else{
    file_put_contents($lockfile, 1, true);
}
 
for($i=0; $i<300; $i++){
    echo date('Y-m-d H:i:s')."\r\n";
    sleep(1);
}
 
unlink($lockfile);
?>
这样的确可以保证任务执行其间不会有新任务执行,但这样需要在任务文件中写代码做判断,不方便。能不能把任务锁定的判断放在任务以外呢?

使用linux flock 文件锁实现任务锁定,解决冲突

格式:

flock [-sxun][-w #] fd#

flock [-sxon][-w #] file [-c] command

选项

-s, --shared:    获得一个共享锁
-x, --exclusive: 获得一个独占锁
-u, --unlock:    移除一个锁,通常是不需要的,脚本执行完会自动丢弃锁
-n, --nonblock:  如果没有立即获得锁,直接失败而不是等待
-w, --timeout:   如果没有立即获得锁,等待指定时间
-o, --close:     在运行命令前关闭文件的描述符号。用于如果命令产生子进程时会不受锁的管控
-c, --command:   在shell中运行一个单独的命令
-h, --help       显示帮助
-V, --version:   显示版本
继续用回第一个test.php,文件锁使用独占锁,如果锁定则失败不等待。参数为-xn
* * * * * flock -xn /tmp/mytest.lock -c 'php /home/fdipzone/php/test.php >> /home/fdipzone/php/test.log'
这样当任务未执行完成,下一任务判断到/tmp/mytest.lock被锁定,则结束当前的任务,下一周期再判断。

--------------------- 
作者:傲雪星枫 
来源:CSDN 
原文:https://blog.csdn.net/fdipzone/article/details/38284009 
版权声明:本文为博主原创文章,转载请附上博文链接!

linux使用flock文件锁解决crontab冲突问题相关推荐

  1. linux使用flock文件锁解决脚本周期内未执行完重复执行

    linux使用flock文件锁解决脚本周期内未执行完重复执行 关于flock flock 是对于整个文件的建议性锁.也就是说,如果一个进程在一个文件(inode)上放了锁,那么其它进程是可以知道的.( ...

  2. linux使用flock解决crontab任务冲突

    Linux的crontab最小的间隔是每分钟执行一次,但是如果在这一分钟之内,之前的命令并没有执行完成呢?这样就会产生冲突.接下来我介绍一个解决冲突的办法,那就是linux的flock文件锁. 格式: ...

  3. Linux flock文件锁详解

    摘要1:https://www.cnblogs.com/zhaojingyu/p/8955851.html 摘要2:https://www.cnblogs.com/wangxusummer/p/493 ...

  4. int linux 原子操作_linux c++编程之多线程:原子操作如何解决线程冲突

    在多线程中操作全局变量一般都会引起线程冲突,为了解决线程冲突,引入原子操作. 1.线程冲突 #include #include #include #include int g_count = 0;vo ...

  5. flock文件锁的学习和应用

    flock文件锁 学习与应用  2016-9-20 作用: 可以使用flock文件锁,避免指定命令的同时执行.(实现任务锁定,解决冲突) 用法: # flock -xn /opt/lock_file ...

  6. Linux中POSIX文件锁的实现

    我试图通过个人的理解方式讲解Linux文件锁的实现,使用的内核版本是3.13.0. POSIX文件锁简介 先简单说下什么是文件锁. Linux文件锁有两种:协同锁(有些成为建议锁)和强制锁.Linux ...

  7. php 文件锁 重发请求,PHP使用文件锁解决高并发问题示例

    本文实例讲述了PHP使用文件锁解决高并发问题.分享给大家供大家参考,具体如下: 新建一个.txt文件,文件中什么都不用写. [一].阻塞(等待)模式:(只要有其他进程已经加锁文件,当前进程会一直等其他 ...

  8. .net 本地文件管理 代码_Gitee 在线解决代码冲突上线,解决冲突不再需要 Git 命令...

    IT服务圈儿 有温度.有态度的IT自媒体平台 来源: OSCHINA 社区 [http://www.oschina.net] 作者:码云Gitee 许多开发者在使用 Git 的时候会遇到代码冲突的情况 ...

  9. linux系统灾难恢复,轻松解决 Linux操作系统故障恢复技巧

    轻松解决 Linux操作系统故障恢复技巧 更新时间:2006年10月24日 00:00:00   作者: 不论你在运行什么操作系统,在很多情况下,你会面对灾难恢复操作.你的主引导区被覆盖,你的硬盘不能 ...

  10. Linux时间变慢解决方法

    2019独角兽企业重金招聘Python工程师标准>>> 情景:系统为CentOS-5.4,硬件时间正确(查看硬件时间的方法见下面),系统时间每隔24小时会慢20分钟左右 Linux将 ...

最新文章

  1. Codeforces Round #406 (Div. 1) B. Legacy(线段树上优化建图)
  2. 经济危机过后,中国会变成什么样
  3. setTimeout() setInterval()
  4. 10鼎信诺为什么安装不了_鼎信诺审计软件一周常见问题(4.134.17)
  5. Eclipse4JavaEE安装SpringBoot
  6. fastjson JSONObject.toJSONString 出现 $ref: $.的解决办法(重复引用)
  7. Objective-C 协议(protocol)
  8. python字符串长度排序_python-对混合类型和不同长度的字符串进行排序
  9. LINUX下载编译libssh2
  10. java连接达梦数据库_java连接达梦数据库的简单代码
  11. 网络安全DOS攻击✍
  12. 第三方平台通过钉钉扫码登录实现方案
  13. win7禁用显示方向旋转快捷键
  14. Python数据类型-list得切片(slices)
  15. 什么是电感_共模电感和差模电感的区别
  16. python的def语句_关于语法:python def函数:如何指定函数的结尾?
  17. Android系统屏幕亮度调节Brightness
  18. Android 使用Loader轻松实现仿微信图片加载
  19. java sencha_sencha编译出错
  20. 纯java编写的联机五子棋项目(附带开源链接)

热门文章

  1. android方法中添加 N,AndroidN(7.0)Settings模块界面加载流程学习
  2. sleuth zipkin mysql_springCloud的使用08-----服务链路追踪(sleuth+zipkin)
  3. c语言中形参和实参的区别
  4. linux smartctl 命令,在 CentOS 7 里用 smartctl 和 hdparm 对硬盘进行基本测试
  5. 宏转录组方法_中山大学医学院施莽教授学术讲座:宏转录组方法在病原生物学领域的应用...
  6. 【HDU5008】Boring String Problem(后缀数组+二分查找+st表)
  7. 【持续更新】最小生成树题目集合
  8. matlab程序中中零内插在qdpsk调制中的作用,桂林电子科技大学通信原理思考题
  9. TSAP(4) : 时间序列采样[asfreq( ) VS resample( )]
  10. 阿里云云计算 37 PolarDB MySQL的连接