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

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

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

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

cron.php

1
2
3
4
5
6
7
8
9
$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

1
2
3
4
5
6
7
8
9
10
<?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 选项指明加锁成功后要执行的命令。

 

模拟脚本超时

1
2
3
4
5
6
7
8
9
10
11
<?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脚本 , 阻塞在那里了.

posted @   唯一客服系统开发笔记  阅读(687)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2016-03-09 [nodejs] nodejs开发个人博客(四)数据模型
2016-03-09 [android] listview入门
点击右上角即可分享
微信分享提示
1
chat with us