zoukankan      html  css  js  c++  java
  • [日常] crontab的秒执行和串行化和多进程实现

    1. crontab的最低运行频率是,按照每分钟执行一次,通过在脚本中简单实现按秒级别运行

    比如这条cron规则 , 每分钟执行一次脚本 

    * * * * * php /var/www/html/test/cron.php

    cron.php

    $i=0;
    while(1){
            $i++;
            if($i>60) break;
            $pid=getmypid();
            //查询队列等任务
            file_put_contents("/tmp/cron_test","{$pid}=={$i}
    ",FILE_APPEND);
            sleep(1);
    }
    

    不停顿,每秒执行一次,前面的数字是当前的进程id,可以看到进程更换了

      

    2. 两个进程同时每秒执行,只需要改下数字60改成120

    <?php
    $i=0;
    while(1){
            $i++;
            if($i>120) break;
            $pid=getmypid();
            //查询队列等任务
            file_put_contents("/tmp/cron_test","{$pid}=={$i}
    ",FILE_APPEND);
            sleep(1);
    }
    

      

    3.处理crontab冲突 , 同一时间只允许一个任务执行 , 使用flock文件锁

    如果一个任务超过了一分钟没执行完 , 下个任务开启时会检测文件是否已经被加了锁 , 如果加锁失败就不执行脚本了

    默认使用阻塞模式,就是其他进程会一直等待这个文件释放锁,释放后就立即执行

    * * * * * flock -xn /tmp/mycron.lock -c 'php /var/www/html/test/cron.php'

    将命令作为 flock 的 -c 选项的参数。flock 命令中,-x 表示对文件加上排他锁,-c 选项指明加锁成功后要执行的命令。

    模拟脚本超时

    <?php
    $i=0;
    while(1){
            $i++;
            //模拟进程耗时长
            if($i>rand(60,130)) break;
            $pid=getmypid();
            //查询队列等任务
            file_put_contents("/tmp/cron_test","{$pid}=={$i}
    ",FILE_APPEND);
            sleep(1);
    }
    

      

    下面的截图可以看到 , 第二个进程执行到了flock命令 , 但是没有执行到php脚本 , 阻塞在那里了.

  • 相关阅读:
    Tomcat7修改根路径应用
    Linux 双网卡绑定
    nginx 动态黑名单
    LINUX 字体查看 字体更改mkfontdir
    iptables 有关计算机名解析问题
    godaddy SSL证书不信任
    要远程登录,你需要具有通过远程桌面服务进行登录的权限...
    如何用jQuery获得select的值
    jQuery 选中tr下面的第某个td
    c#中char、string转换为十六进制byte的浅析
  • 原文地址:https://www.cnblogs.com/taoshihan/p/8535223.html
Copyright © 2011-2022 走看看