cron是Linux下的一个老牌的任务调度器(scheduler),它根据cron table上的排程来定时执行任务,而命令crontab的目标很单一,就是在维护cron table。系统上每个用户可以有自己的cron table,这些cron table都在文件夹/var/spool/cron 下,以各自用户名为文件名的的文件里储存着各用户的cron table,所以其实命令crontab就是在维护这些文件,但是出于安全方面的考虑,还是建议用命令crontab来维护cron table。

1. crontab 命令参数介绍

最常用的

>crontab -e

修改本用户的cron table,其实等价于命令vi /var/spool/cron/${USER}

>crontab -l

列出本用户的cron table,等价于cat /var/spool/cron/${USER}

>crontab -r

绝对要慎用!直接删除cron table,不进行任何询问!加个 -i 参数会询问是否需要删除。

还有个 -u 参数,可以对指定用户的cron table进行操作,一般root用户才有这个权限。

还有两个文件

/etc/cron.allow

/etc/cron.deny

来控制谁可以使用命令crontab,默认情况下只留有cron.deny文件。如果两个文件都不存在,那么只有super user可以使用命令crontab。

2. cron table的写法

用命令

>crontab -e

一般可以看到一个用vim打开了的空白文件,那就让我们开始吧!

在cron table中,一行代表一个job,注释以#开始,到本行结束。如下:

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  *  user-name command to be executed

cron排程的最小粒度是分钟,在cron table中,前五个以空格隔开的位置表示着job的执行周期,第六位可以指定用户名,也可不填,后面的部分就是job要执行的命令。

在指定job的执行周期的前五位中,

* 代表本位置能取得到的任意数字

n-m 代表从n到m的范围内都取到

n,m 代表只取n和m两个数值

/n 代表每n个单位执行一次

例如:

*/10 2-6 * * 0,1 /root/cmd.sh

代表每周六、周日的早上2点到6点内,每隔10分钟执行一次/root/cmd.sh脚本。

在cron table 中还可以用一些预先定义好的执行周期,如下表所列:

预定义周期 等价于 描述
@yearly (or @annually) 0 0 1 1 * 每年1月1日凌晨0点执行一次
@monthly 0 0 1 * * 每月1日凌晨0点执行一次
@weekly 0 0 * * 0 每个星期天的凌晨0点执行一次
@daily 0 0 * * * 每天凌晨0点执行一次
@hourly 0 * * * * 每小时执行一次
@reboot 每次系统启动时执行一次

所以可以直接这样

@hourly /root/cmd.sh

来每小时执行一次脚本。