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