Crontab - 周期性任务

cron是类unix系统中的周期性任务工具 [1] ,使系统维护和管理能够自动化。cron这个名称来自于古希腊语中的“时间”,χρόνος 柯罗诺斯

配置

cron的配置文件为 crontab ,是cron table的简写,分为系统 crontab 和用户 crontab

系统crontab

由系统管理员制定的系统维护以及其他任务的crontab文件,与用户任务配置文件格式略有不同,可以通过USERNAME字段指定由哪个用户身份来执行任务。

cat /etc/crontab

SHELL=/bin/sh  指定要使用的shell
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin  指定了系统执行命令的路径
MAILTO=USERNAME  通过电子邮件发送任务执行信息给用户
HOME=/  执行任务时使用的主目录
* * * * *  USERNAME 命令

用户crontab

用户crontab文件存放在/var/spool/cron/[crontabs]目录下,以所属用户的登录名来命名,cron根据文件名来决定执行任务时应该使用的用户身份。

cat /var/spool/cron/[crontabs] USERNAME

* * * * * 命令

crontab格式

* * * * *   [USERNAME] 命令
┬ ┬ ┬ ┬ ┬
│ │ │ │ │
│ │ │ │ │
│ │ │ │ └────── 星期 (0 - 6) (0 至 6 是周日至周六)
│ │ │ └────── 月份 (1 - 12)
│ │ └────── 日期 (1 - 31)
│ └────── 小时 (0 - 23)
└────── 分钟 (0 - 59)
  • cron每分钟读取一次crontab文件,按照crontab文件中给出的时间执行指定的任务。
  • crontab文件的每一行代表一个任务,均遵守特定的格式,由空格或tab分隔。
  • 前5个时间字段可以使用特殊字符
  1. 星号(*) 匹配任何可能的值
  2. 划线(-) 隔开两个值,设定范围
  3. 逗号(,) 隔开整数或范围,匹配所有列出的值
  4. 斜线(/) 设置间隔
  • 星期和日期有潜在的二义性,如果同时指定了星期和日期,那么只要有一个条件满足就会执行。
  • *USERNAME*字段只出现在系统crontab文件/etc/crontab和/etc/cron.d目录下的文件,用来指定由哪个用户身份来执行任务。这个字段不会也没有必要出现在用户crontab文件中,因为用户crontab文件名暗含了UID
  • 命令可以是系统命令也可以是编写的脚本

语法

crontab [OPTION] FILE
crontab [OPTION]

将FILE做为crontab的任务列表文件载入crontab,替换之前的所有版本

-u user 用来设定某个用户的crontab服务

-e 编辑某个用户crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件

-l 显示某个用户crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容

-r 删除某个用户crontab文件,如果不指定用户,则默认删除当前用户的crontab文件

-i 在删除用户crontab文件时给确认提示

权限

用/etc/cron.deny 和 /etc/cron.allow 指定哪些用户可以提交crontab文件。如果存在cron.allow文件,那么它将包含可以提交crontan的所有用户名单,名单每行一个用户, 任何没被列出的用户都不能使用crontab。如果没有cron.allow文件,那么将检查是否有cron.deny文件,除了名单中列出的用户, 所有其他用户都允许使用crontab。如果cron.allow和cron.deny文件都不存在,那么就只有root用户才能使用crontab(debian允许所有用户使用crontab)。

示例

crontab -u root -e 编辑root用户的crontab文件
* * * * * command 每1分钟执行一次 [#]_
3,15 * * * * command 每小时的第3和第15分钟执行
3,15 8-11 * * * command 在8点到11点的第3和第15分钟执行
3,15 8-11 */2 * * command 每隔两天的8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 command 每个星期一的8点到11点的第3和第15分钟执行
30 21 * * * command 每晚的21:30执行
45 4 1,10,22 * * command 每月1、10、22日的4:45执行
10 1 * * 6,0 command 每周六、周日的1:10执行
0,30 18-23 * * * command 每天18点至23点之间每隔30分钟执行
0 23 * * 6 command 每个星期六的23点执行
* */1 * * * command 每一小时执行
* 23-7/1 * * * commadn 晚上23点到早上7点之间,每隔一小时执行

保存文件时, cron会对其进行检查,如果其中的某个字段出现了超出允许范围的值,cron会发出警告

参考文献

[1]Cron - Wikipedia
[2]每天一个linux命令(50):crontab命令