linux里面的crontab命令可以用来运行定时任务。当php项目里面涉及到一些定时脚本的时候,我一般会选择使用crontab来执行定时脚本。

下面先来看一下crontab命令:

查看当前用户下的crontab文件可以这样:

crontab -l命令,可以查看当前用户下的所有所有定时任务

crontab -e命令,可以编辑定时任务。

crontab -r命令,可以删除当前用户下的定时任务


关于定时任务的格式是这样的:

minute hour day month week command

关于minute hour day month week的取值,范围是这样的:

  • minute: 0~59之间的整数。
  • hour: 0~23之间的整数
  • day: 1~31之间的整数
  • month: 1~12之间的整数
  • week: 0~7之间的整数。其中0或者7表示星期日。

可见,最低粒度只能到分钟级别,如果要到级别,就要自己写循环了。

下面举几个例子来说明时间的设定:

例一、每天0点0分执行/home/user/nemo/dir/demo.php脚本

0 0 * * * cd /home/user/nemo/dir && /home/users/nemo/php/bin/php demo.php

注意,crontab里面的command是不知道某个bin的路径的,所以需要你在定时任务里面自己指定bin的路径。

比如说crontab不知道我调用的是哪个php bin,所以我需要把php这个bin的绝对路径写出来

例二、每天1点、12点、18点整点,执行上面那个脚本

0 1,12,18 * * * cd /home/user/nemo/dir && /home/users/nemo/php/bin/php demo.php

在这个定时任务里面,我让hour的值是1,12,18就能够达到1点、12点、18点都执行的目的

例三、每20分钟执行上面那个脚本

*/20 * * * * cd /home/user/nemo/dir && /home/users/nemo/php/bin/php demo.php

在这个定时任务里面,我让minute的值是*/20就表示每20分钟

例四、每天的10点到11点期间,每10分钟执行上面那个脚本

*/10 10-11 * * * cd /home/user/nemo/dir && /home/users/nemo/php/bin/php demo.php

在这个定时任务里面,我让hour的值是10-11就表示是10点到11点之间


所有用户定义的crontab文件都被保存在 /var/spool/cron目录中,其文件名与用户名一致。


上面说的是用户调度,linux里面除了用户任务调度还有系统任务调度。

查看系统的/etc/crontab文件,结果是这样的:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

SHELL变量设置了系统用哪个shell;PATH变量指定了系统执行命令的路径;MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户;HOME变量指定了在执行命令或者脚本时使用的主目录。

之所以定时任务能够运行,是因为linux系统中有cron守护进程,它负责周期性地执行任务。

由于cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务:

/sbin/service crond start //启动服务

/sbin/service crond stop //关闭服务

/sbin/service crond restart //重启服务

/sbin/service crond reload //重新载入配置

你也可以将这个服务在系统启动的时候自动启动:

/etc/rc.d/rc.local这个脚本的末尾加上:

/sbin/service crond start