contab+flock实现防止重复执行的定时任务

场景:需要实时处理redis队列消息

使用linux中的contab定时任务每隔一分钟执行一次,为防止一分钟后该脚本还没执行完,下个脚本重复执行,使用flock锁的方式

crontab -e

添加如下内容

*/1 * * * * flock -xw 60  /tmp/mytest.lock -c 'php /www/index.php'         

 

独占锁+等待时间60秒是防止后面进程一直堆积(个人理解不一定正确)

flock:

  • -s, --shared: 获得一个共享锁

  • -x, --exclusive: 获得一个独占锁

  • -u, --unlock: 移除一个锁,通常是不需要的,脚本执行完会自动丢弃锁

  • -n, --nonblock: 如果没有立即获得锁,直接失败而不是等待

  • -w, --timeout: 如果没有立即获得锁,等待指定时间

  • -o, --close: 在运行命令前关闭文件的描述符号。用于如果命令产生子进程时会不受锁的管控

  • -c, --command: 在shell中运行一个单独的命令

  • -h, --help 显示帮助

  • -V, --version: 显示版本

 

执行的文件index.php里的内容(判断脚本执行的时间超过60秒就结束,这样下个等待中的进程就可以继续执行,实现无缝执行):

$start = time();
while(1){
    $file = file_get_contents('D:/abc.txt');
    $file .= "\r\n".date("Y-m-d H:i:s");
    file_put_contents('D:/abc.txt',$file);
    sleep(1);
    $end = time();
    if(($end-$start)>=60){
        exit;
    }
}

 

 

 

 

你可能感兴趣的:(PHP,linux)