crontab 参数详解

简介

crontab 命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于 crontab 文件中,以供之后读取和执行。在一些需要定期循环执行脚本的情形下(比如定期释放内存,定期删除过期文件),使用 crontab 往往比在脚本内编写定时器便捷得多。下面就来说说 crontab 参数。

cron 任务分为两类:

  1. 系统cron任务 ,主要用于实现系统自身的维护。必须手动编辑 /etc/crontab 文件来实现。
  2. 用户cron任务 ,主要用于各用户间自定义操作。可以编辑 /var/spool/cron/USERNAME 文件实现,也可以使用 crontab 命令来实现。

系统cron文件 的主要格式为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[hzz@magedu ~]$ cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# 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

[hzz@magedu ~]$

用户cron文件 的主要格式为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[hzz@magedu ~]$ cat /var/spool/cron/hzz
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=hzz

# For details see man 4 crontabs

# 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
# | | | | |
# * * * * * command to be executed

[hzz@magedu ~]$

从上面可以看出,系统级别的 cron 需要指定用户执行,其他的格式和用户级别的 cron 配置一致。

注意:

  1. 定义 COMMAND 时,如果命令需要用到 % ,需要对其转义;但放置于单引号中的 % 不用转义亦可。
  2. 要保证 crond 进程的运行才能使 cron 生效。
  3. cron 有自己默认的环境变量,若 cron 执行的命令中用到用户环境变量或自定义环境变量,需要在命令或脚本中再次定义。

使用方式

由于系统级别的 cron 不常用,以及不建议通过直接修改文件的方式布置 cron ,故着重说明 crontab 命令的用法。

常用参数

1
2
3
4
5
6
7
crontab [-u user] file  -用指定的文件替代目前的crontab。
crontab -l -列出用户目前的crontab。
crontab -e -编辑用户目前的crontab。
crontab -d -删除用户目前的crontab。
crontab -c dir -指定crontab的目录。
crontab -r -移除所有任务;即删除 /var/spool/cron/USERNAME 文件。
crontab -u user -用户(root)可为指定用户管理cron任务。

日志路径

more /var/log/cron

基本格式

1
2
3
4
5
6
7
8
9
10
f1 f2 f3 f4 f5 command

f1表示分钟059 每分钟用*或者 */1表示。
f2表示小时0230表示0点)。
f3表示日期131
f4表示月份112
f5表示星期0707表示星期天)。
command表示要运行的命令。

# 具体可参照第一节的文件格式。

示例

1
2
3
# 每晚的21:30重启apache。

30 21 * * * /usr/local/etc/rc.d/lighttpd restart
1
2
3
# 每月1、10、22日的4:45重启apache。

45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
1
2
3
# 每周六、周日的1:10重启apache。

10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
1
2
3
# 每天18:00至23:00之间每隔30分钟重启apache。

0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
1
2
3
# 每星期六的11:00 pm重启apache。

0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
1
2
3
# 每一小时重启apache。

* */1 * * * /usr/local/etc/rc.d/lighttpd restart
1
2
3
# 晚上11点到早上7点之间,每隔一小时重启apache。

* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
1
2
3
# 每月的4号与每周一到周三的11点重启apache。

0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
1
2
3
# 一月一号的4点重启apache。

0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart

通知方式(mail)

cron 执行结果默认是通过本地电子邮件服务来通知的(也可以通过 /var/log/cron 手动查看执行结果),下面就顺便来说说 mail 的简单实用。

mail概念

smtp :simple mail transmission protocol.
pop3 :Post Office Procotol.
imap4 :Internet Mail Access Procotol.

发送邮件

1
2
3
mail [-s 'title']username[@hostname]

# 输入 "." 单独成行或者 "Ctrl+d" 进行提交发送。
1
2
3
4
5
6
# 发送邮件给自己

ubuntu@huangzhongzhang:~$ mail -s test ubuntu
Just test!
.
ubuntu@huangzhongzhang:~$

以上命令只能是交互式进行发送,我们可以使用输入重定向或管道的方式让其可以在脚本中自动发送,比如:

1
2
3
4
5
6
7
# 输入重定向

mail -s 'title' hzz < /etc/fstab

# 通过管道

echo "hello"|mail -s 'title' hzz

接收邮件

接收邮件比较简单,执行 mail ,输入邮件编号即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ubuntu@huangzhongzhang:~$ mail
s-nail version v14.8.6\. Type ? for help.
"/var/mail/ubuntu": 2 messages 1 new
O 1 ubuntu Wed May 10 10:25 16/525 test
>N 2 ubuntu Wed May 10 10:29 15/516 test
? 2
[-- Message 2 -- 15 lines, 516 bytes --]:
From ubuntu@localhost.localdomain Wed May 10 10:29:21 2017
Date: Wed, 10 May 2017 10:29:21 +0800
To: ubuntu@localhost.localdomain
Subject: test
Message-Id: <20170510022921.D5BD41E6DB@localhost.localdomain>
From: ubuntu@localhost.localdomain (ubuntu)

Just test!

? q # 若想执行更多操作,可输入 ? 查看使用帮助。
Held 2 messages in /var/mail/ubuntu
You have mail in /var/mail/ubuntu
ubuntu@huangzhongzhang:~$

其他: anacron

如果某任务在指定的时间因关机未能执行,下次开机是不会自动执行的,只能到相应时间点才会执行。

如果期望某时间因故未能按时执行,下次开机后无论是否到了相应时间点都要执行一次,可使用 anacron 实现。

anacron 默认由 cron 每隔1小时调用一次,具体可查看 /etc/cron.hourly/0anacron ,但如果是为了快速执行 anacron 以便恢复因关机而遗漏的任务,建议设置成开机执行。

配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[hzz@magedu ~]$ sudo cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22

#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
[hzz@magedu ~]$
1
2
3
4
5
6
7
8
9
1   5   cron.daily      nice run-parts /etc/cron.daily
| | | | |
|--|--------|------------|-----------|--------- 运行时间,单位为天(上例中为 1)。
|--------|------------|-----------|--------- 启动 Anacron 和运行作业之间的延迟,单位为分钟,前提是自最后一次运行之后所经过的时间超出了运行时间。需要对作业使用不同的运行延迟,防止所有作业同时运行,从而影响系统性能。
|------------|-----------|--------- 作业名(前例中为 cron.daily)。
|-----------|--------- 优先级(1-19)。
|--------- 要运行的命令。在前例中,命令名为 run-parts /etc/cron.daily。

# 上述配置的意思为:执行 anacron 时,若任务超过 1 天未执行,延迟 5 分钟执行(使用 run-parts 执行 /etc/cron.daily 任务列表),未超过则不执行。

命令参数

1
2
3
4
5
6
7
8
9
10
anacron [-sfn] [job]..

anacron -u [job]..

选项与参数:
-s :开始一连续的执行各项工作 (job),会依据时间记录档的资料判断是否进行;
-f :强制进行,而不去判断时间记录档的时间戳记;
-n :立刻进行未进行的任务,而不延迟 (delay) 等待时间;
-u :仅更新时间记录档的时间戳记,不进行任何工作;
job :由 /etc/anacrontab 定义的各项工作名称。

参考

anacron 在服务器上不常用(因为服务器不可能隔三岔五地关机或重启),更多地是使用在 PC 端的 Linux 上面,由于平时很少见也很少用,所以就不多作介绍了,更多信息可参考下面的文章。

《例行性工作排程(crontab)》

《使用 Anacron 处理 Linux 关机问题》