1. 云栖社区>
  2. PHP教程>
  3. 正文

linux使用flock文件锁解决crontab冲突问题

作者:用户 来源:互联网 时间:2017-12-01 20:35:16

linux问题文件crontab冲突使用解决flock

linux使用flock文件锁解决crontab冲突问题 - 摘要: 本文讲的是linux使用flock文件锁解决crontab冲突问题, Linux的crontab命令,可以定时执行操作,最小周期是每分钟执行一次。关于crontab实现每秒执行可参考我之前的文章《linux crontab 实现每秒执行》 现在有个问题,如果设定了任务每分钟执行一次,但有可能一分钟内任务

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


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


例如:




[php]
view plain
copy
<?
//test.php
for($i=0;$i<300;$i++){
echodate('Y-m-dH:i:s')."/r/n";
sleep(1);
}
?>
循环300次,每循环一次睡眠1秒。执行完成需要300秒即5分钟。


设置crontab 为每分钟执行




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


3分钟后,看到有3个test.PHP进程在执行。




[plain]
view plain
copy
[email protected] :/tmp$psaux|greptest.php
fdipzone29950.00.04220588?Ss00:280:00/bin/sh-cphp/home/fdipzone/php/test.php>>/home/fdipzone/php/test.log
fdipzone29960.00.81083288564?S00:280:00php/home/fdipzone/php/test.php
fdipzone30330.00.04220584?Ss00:290:00/bin/sh-cphp/home/fdipzone/php/test.php>>/home/fdipzone/php/test.log
fdipzone30340.10.81083288564?S00:290:00php/home/fdipzone/php/test.php
fdipzone30470.00.04220588?Ss00:300:00/bin/sh-cphp/home/fdipzone/php/test.php>>/home/fdipzone/php/test.log
fdipzone30481.30.81083288560?S00:300:00php/home/fdipzone/php/test.php
fdipzone30510.00.1131481068pts/0S+00:300:00grep--color=autotest.php


我们是希望执行完上一任务,再执行下一任务,如果上一任务未执行完成,则这次的任务不执行,直到下一周期再判断,如果上一任务执行完成,则可以执行下一任务。



改进方法


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


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


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




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



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


格式:


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


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


选项




[plain]
view plain
copy
-s,--shared:获得一个共享锁
-x,--exclusive:获得一个独占锁
-u,--unlock:移除一个锁,通常是不需要的,脚本执行完会自动丢弃锁
-n,--nonblock:如果没有立即获得锁,直接失败而不是等待
-w,--timeout:如果没有立即获得锁,等待指定时间
-o,--close:在运行命令前关闭文件的描述符号。用于如果命令产生子进程时会不受锁的管控
-c,--command:在shell中运行一个单独的命令
-h,--help显示帮助
-V,--version:显示版本
继续用回第一个test.php,文件锁使用独占锁,如果锁定则失败不等待。参数为-xn




[plain]
view plain
copy
*****flock-xn/tmp/mytest.lock-c'php/home/fdipzone/php/test.php>>/home/fdipzone/php/test.log'
这样当任务未执行完成,下一任务判断到/tmp/mytest.lock被锁定,则结束当前的任务,下一周期再判断。

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索linux , 问题 , 文件 , crontab , 冲突 , 使用 , 解决 flock ,以便于您获取更多的相关知识。