linux使用flock文件锁解决crontab冲突问题
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冲突问题相关推荐
- linux使用flock文件锁解决脚本周期内未执行完重复执行
linux使用flock文件锁解决脚本周期内未执行完重复执行 关于flock flock 是对于整个文件的建议性锁.也就是说,如果一个进程在一个文件(inode)上放了锁,那么其它进程是可以知道的.( ...
- linux使用flock解决crontab任务冲突
Linux的crontab最小的间隔是每分钟执行一次,但是如果在这一分钟之内,之前的命令并没有执行完成呢?这样就会产生冲突.接下来我介绍一个解决冲突的办法,那就是linux的flock文件锁. 格式: ...
- Linux flock文件锁详解
摘要1:https://www.cnblogs.com/zhaojingyu/p/8955851.html 摘要2:https://www.cnblogs.com/wangxusummer/p/493 ...
- int linux 原子操作_linux c++编程之多线程:原子操作如何解决线程冲突
在多线程中操作全局变量一般都会引起线程冲突,为了解决线程冲突,引入原子操作. 1.线程冲突 #include #include #include #include int g_count = 0;vo ...
- flock文件锁的学习和应用
flock文件锁 学习与应用 2016-9-20 作用: 可以使用flock文件锁,避免指定命令的同时执行.(实现任务锁定,解决冲突) 用法: # flock -xn /opt/lock_file ...
- Linux中POSIX文件锁的实现
我试图通过个人的理解方式讲解Linux文件锁的实现,使用的内核版本是3.13.0. POSIX文件锁简介 先简单说下什么是文件锁. Linux文件锁有两种:协同锁(有些成为建议锁)和强制锁.Linux ...
- php 文件锁 重发请求,PHP使用文件锁解决高并发问题示例
本文实例讲述了PHP使用文件锁解决高并发问题.分享给大家供大家参考,具体如下: 新建一个.txt文件,文件中什么都不用写. [一].阻塞(等待)模式:(只要有其他进程已经加锁文件,当前进程会一直等其他 ...
- .net 本地文件管理 代码_Gitee 在线解决代码冲突上线,解决冲突不再需要 Git 命令...
IT服务圈儿 有温度.有态度的IT自媒体平台 来源: OSCHINA 社区 [http://www.oschina.net] 作者:码云Gitee 许多开发者在使用 Git 的时候会遇到代码冲突的情况 ...
- linux系统灾难恢复,轻松解决 Linux操作系统故障恢复技巧
轻松解决 Linux操作系统故障恢复技巧 更新时间:2006年10月24日 00:00:00 作者: 不论你在运行什么操作系统,在很多情况下,你会面对灾难恢复操作.你的主引导区被覆盖,你的硬盘不能 ...
- Linux时间变慢解决方法
2019独角兽企业重金招聘Python工程师标准>>> 情景:系统为CentOS-5.4,硬件时间正确(查看硬件时间的方法见下面),系统时间每隔24小时会慢20分钟左右 Linux将 ...
最新文章
- Codeforces Round #406 (Div. 1) B. Legacy(线段树上优化建图)
- 经济危机过后,中国会变成什么样
- setTimeout() setInterval()
- 10鼎信诺为什么安装不了_鼎信诺审计软件一周常见问题(4.134.17)
- Eclipse4JavaEE安装SpringBoot
- fastjson JSONObject.toJSONString 出现 $ref: $.的解决办法(重复引用)
- Objective-C 协议(protocol)
- python字符串长度排序_python-对混合类型和不同长度的字符串进行排序
- LINUX下载编译libssh2
- java连接达梦数据库_java连接达梦数据库的简单代码
- 网络安全DOS攻击✍
- 第三方平台通过钉钉扫码登录实现方案
- win7禁用显示方向旋转快捷键
- Python数据类型-list得切片(slices)
- 什么是电感_共模电感和差模电感的区别
- python的def语句_关于语法:python def函数:如何指定函数的结尾?
- Android系统屏幕亮度调节Brightness
- Android 使用Loader轻松实现仿微信图片加载
- java sencha_sencha编译出错
- 纯java编写的联机五子棋项目(附带开源链接)
热门文章
- android方法中添加 N,AndroidN(7.0)Settings模块界面加载流程学习
- sleuth zipkin mysql_springCloud的使用08-----服务链路追踪(sleuth+zipkin)
- c语言中形参和实参的区别
- linux smartctl 命令,在 CentOS 7 里用 smartctl 和 hdparm 对硬盘进行基本测试
- 宏转录组方法_中山大学医学院施莽教授学术讲座:宏转录组方法在病原生物学领域的应用...
- 【HDU5008】Boring String Problem(后缀数组+二分查找+st表)
- 【持续更新】最小生成树题目集合
- matlab程序中中零内插在qdpsk调制中的作用,桂林电子科技大学通信原理思考题
- TSAP(4) : 时间序列采样[asfreq( ) VS resample( )]
- 阿里云云计算 37 PolarDB MySQL的连接