首页 > 系统相关 >linux使用flock文件锁解决脚本重复执行问题

linux使用flock文件锁解决脚本重复执行问题

时间:2023-06-11 18:33:09浏览次数:55  
标签:脚本 执行 00 fdipzone linux test home flock php


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进程在执行。

 

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

改进方法

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

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

如果锁文件

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

已经存在,则退出这次的任务。

 


<?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被锁定,则结束当前的任务,下一周期再判断。


标签:脚本,执行,00,fdipzone,linux,test,home,flock,php
From: https://blog.51cto.com/u_6186189/6458528

相关文章

  • web服务器一键安装脚本 EZHTTP
    EZHTTP是集成了nginx apache php mysql memcached等web服务器软件的一键安装脚本,它能自由选择安装任意的软件,自动选最优线路下载,定制容易。如何安装因为安装时间会比较久,建议安装前使用screen,screen使用方法如下:1、首先得安装screen,ubuntu使用apt-getinstallscreen,centos或r......
  • linux sort,uniq,cut,wc命令详解
        sortsort命令对File参数指定的文件中的行排序,并将结果写到标准输出。如果File参数指定多个文件,那么sort命令将这些文件连接起来,并当作一个文件进行排序。sort语法[root@www~]#sort[-fbMnrtuk][fileorstdin]选项与参数:-f:忽略大小写的差异,例如A与......
  • linux命令行elasticsearch查询工具es2unix
    当想在linux的命令行中查看elasticsearch的状态时,可以用es2unix这个工具,插件地址: https://github.com/elasticsearch/es2unix。它是elasticsearch官方推出的,可以通过命令来查看es的各种状态,安装方法curl-sdownload.elasticsearch.org/es2unix/es>/bin/eschmod+x/bin/es这......
  • Linux的启动顺序
      Linux是一个多用户、多任务‘支持多线程和多CPU的操作系统,可以想象到它的启动会有多么复杂。                  1.Linux的启动流程及涉及的程序或者模块  在你打开计算机的电源之后,计算机的硬件会启动BIOS或者UEFI来加载并检查设备,比如......
  • linux 内核版本
    截止支持时间CentOSversion  Releasedate  Fullupdates[40][41]  Maintenanceupdates[40][41]3  2004-03-19  2006-07-20  2010-10-31[42]4  2005-03-09  2009-03-31  2012-02-29[42][43]5  2007-04-12  2014-01-31  2017-03-3......
  • Burp Suite Professional / Community 2023.6 (macOS, Linux, Windows) - Web 应用安
    BurpSuiteProfessional/Community2023.6(macOS,Linux,Windows)-Web应用安全、测试和扫描BurpSuiteProfessional,Test,find,andexploitvulnerabilities.请访问原文链接:https://sysin.org/blog/burp-suite-pro-2023/,查看最新版。原创作品,转载请保留出处。作者......
  • linux 脚本基础实战1
    脚本完成功能1.显示出本机的ip地址2.如果ip地址中有3这个数字,打印出当前的系统时间3.如果ip地址中不含3这个数字,批量建立用户magedu_00,magedu_01,...magedu_100,所有用户同属于magedu组4.打印/etc/passwd这个文件中可以登陆的用户(非/usr/sbin/nologin)5.yum安装ngin......
  • Redis学习笔记4-脚本、持久化和集群 Redis学习笔记1-基础命令及数据结构: http://blog.
        Redis学习笔记4-脚本、持久化和集群Redis学习笔记1-基础命令及数据结构:http://blog.guoyb.com/2016/07/21/learn-redis-basic-commands/Redis学习笔记2-事务与过期时间:http://blog.guoyb.com/2016/08/23/learn-redis-adv/Redis学习笔记3-排序与消息通知:http://blog......
  • 透过 Go 语言探索 Linux 网络通信的本质
    前言各种编程语言百花齐放、百家争鸣,但是“万变不离其中”。对于网络通信而言,每一种编程语言的实现方式都不一样;但其实,调用的底层逻辑都是一样的。linux系统底层向上提供了统一的Socket通信系统函数,动态链接库/lib64/libc.so中就是实现网络通信的关键类库。下面我们会以Go......
  • Linux命令篇 - tar 命令
    tarGNU`tar'savesmanyfilestogetherintoasingletapeordiskarchive,andcanrestoreindividualfilesfromthearchive.tar:用于压缩和解压缩文件;格式:tar[OPTION...][FILE]...#tar命令常用的功能#以下功能是独立的,一次只能使用一个--c:创建新的tar文件......