ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

[日常] crontab的秒执行和串行化和多进程实现

2021-06-17 20:54:20  阅读:216  来源: 互联网

标签:执行 php pid crontab cron 日常 test flock 串行化


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}\n",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}\n",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}\n",FILE_APPEND);
        sleep(1);
}

  

 

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

标签:执行,php,pid,crontab,cron,日常,test,flock,串行化
来源: https://blog.51cto.com/u_15274085/2919373

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有