微信搜索superit|邀请体验:大数据, 数据管理、OLAP分析与可视化平台 | 赞助作者:赞助作者

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

shell aide_941 24℃

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

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

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

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

cron.php

  1. $i=0;
  2. while(1){
  3. $i++;
  4. if($i>60) break;
  5. $pid=getmypid();
  6. //查询队列等任务
  7. file_put_contents(“/tmp/cron_test”,“{$pid}=={$i}\n”,FILE_APPEND);
  8. sleep(1);
  9. }

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

 

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

  1. <?php
  2. $i=0;
  3. while(1){
  4. $i++;
  5. if($i>120) break;
  6. $pid=getmypid();
  7. //查询队列等任务
  8. file_put_contents(“/tmp/cron_test”,“{$pid}=={$i}\n”,FILE_APPEND);
  9. sleep(1);
  10. }

 

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

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

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

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

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

 

模拟脚本超时

  1. <?php
  2. $i=0;
  3. while(1){
  4. $i++;
  5. //模拟进程耗时长
  6. if($i>rand(60,130)) break;
  7. $pid=getmypid();
  8. //查询队列等任务
  9. file_put_contents(“/tmp/cron_test”,“{$pid}=={$i}\n”,FILE_APPEND);
  10. sleep(1);
  11. }

 

 

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

转载请注明:SuperIT » [日常] crontab的秒执行和串行化和多进程实现

喜欢 (0)or分享 (0)