linux定时任务crontab实现PHP脚本讲解

9 篇文章 0 订阅

      之前有篇文章提到了crontab一直也没补充,今天把它补上。什么是crontab?crontab 是一个用于设置周期性执行任务的工具。

1.liunx系统输入service crond status(或者systemctl status crond)查看crontab的状态;

   如果没有安装使用下列命令:

  • yum install vixie-cron
  • yum install crontabs

  如果安装却没有开启服务使用 service crond start //启动服务 下面列一下常用命令 

  service crond start //启动服务 
  service crond stop //关闭服务 
  service crond restart //重启服务 
  service crond reload //重新载入配置

  service crond status //查看状态

  chkconfig crond on //设置开机自动启动crond服务:

  chkconfig –list crond //开机级别的crond服务运行情况 ,2、3、4、5级别开机会自动启动crond服务 
  chkconfig crond off//取消开机自动启动crond服务:

2.执行的脚本:(两种)


1)、在命令行输入: crontab -e 然后添加相应的任务,wq存盘退出。
crontab -e配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务
crontab -l //列出当前的所有调度任务 
crontab -l -u jp //列出用户jp的所有调度任务
crontab -r //删除所有任务调度工作

2)、直接编辑/etc/crontab 文件,即vi /etc/crontab,添加相应的任务。 

 

3.crontab格式

 一个crontab命令如下所示:

30 10 5,10,15,20 * * php /var/www/html/duizhang/cli.php Admin/Sms/sendSms

//表示每个月的5号,10号,15号,20号的10:30执行此程序

分钟   小时   日   月   星期   命令

*        *      *    *     *       *

第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列 表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
几个特殊符号的含义:
“*”代表取值范围内的数字,
“/”代表”每”,
“-”代表从某个数字到某个数字,
“,”分开几个离散的数字

4.crontab实现每N秒执行

crontab最小的执行时间是一分钟。如需要在小于一分钟内重复执行,可以有两个方法实现。

1.创建一个php做执行动作,非常简单,就是把当前时间写入log。

<?php 
file_put_contents('/home/fdipzone/php/crontab/run.log', date('Y-m-d H:i:s')."\r\n", FILE_APPEND); 
?>

crontab -e 输入以下语句,然后 :wq 保存退出。

* * * * * php /home/fdipzone/php/crontab/tolog.php 
* * * * * sleep 10; php /home/fdipzone/php/crontab/tolog.php 
* * * * * sleep 20; php /home/fdipzone/php/crontab/tolog.php 
* * * * * sleep 30; php /home/fdipzone/php/crontab/tolog.php 
* * * * * sleep 40; php /home/fdipzone/php/crontab/tolog.php 
* * * * * sleep 50; php /home/fdipzone/php/crontab/tolog.php 

使用 tail -f 查看执行情况,可以见到log每10秒被写入一条记录。

tail -f /home/fdipzone/php/crontab/run.log 

//结果
2020-08-06 15:42:01 
2020-08-06 15:42:11 
2020-08-06 15:42:21 
2020-08-06 15:42:31 
2020-08-06 15:42:41 
2020-08-06 15:42:51 
2020-08-06 15:42:01 

原理:通过延时方法 sleep N  来实现每N秒执行。

注意:

60必须能整除间隔的秒数(没有余数),例如间隔的秒数是2,4,6,10,12等。

如果间隔的秒数太少,例如2秒执行一次,这样就需要在crontab 加入60/2=30条语句。不建议使用此方法,可以使用下面介绍的第二种方法。

2.编写shell脚本实现 推荐

#!/bin/bash 
step=2 #间隔的秒数,不能大于60 
for (( i = 0; i < 60; i=(i+step) )); do 
  $(php '/home/fdipzone/php/crontab/tolog.php') 
  sleep $step 
done 
exit 0 

crontab -e 输入以下语句,然后:wq 保存退出。

# m h dom mon dow  command 
* * * * * /home/fdipzone/php/crontab/crontab.sh 

使用 tail -f 查看执行情况,可以见到log每2秒被写入一条记录。

原理:在sh使用for语句实现循环指定秒数执行。

注意:如果60不能整除间隔的秒数,则需要调整执行的时间。例如需要每7秒执行一次,就需要找到7与60的最小公倍数,7与60的最小公倍数是420(即7分钟)。

则 crontab.sh step的值为7,循环结束条件i<420, crontab -e可以输入以下语句来实现

# m h dom mon dow  command 
*/7 * * * * /home/fdipzone/php/crontab/crontab.sh 

 

 

所谓勇者,是心有所惧,唯自知尔!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT阿剂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值