crontab 参数详解
简介
crontab
命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于 crontab
文件中,以供之后读取和执行。在一些需要定期循环执行脚本的情形下(比如定期释放内存,定期删除过期文件),使用 crontab
往往比在脚本内编写定时器便捷得多。下面就来说说 crontab
参数。
cron
任务分为两类:
系统cron任务
,主要用于实现系统自身的维护。必须手动编辑/etc/crontab
文件来实现。用户cron任务
,主要用于各用户间自定义操作。可以编辑/var/spool/cron/USERNAME
文件实现,也可以使用crontab
命令来实现。
系统cron文件
的主要格式为:
[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文件
的主要格式为:
[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
配置一致。
注意:
- 定义
COMMAND
时,如果命令需要用到%
,需要对其转义;但放置于单引号中的%
不用转义亦可。 - 要保证
crond
进程的运行才能使cron
生效。 cron
有自己默认的环境变量,若cron
执行的命令中用到用户环境变量或自定义环境变量,需要在命令或脚本中再次定义。
使用方式
由于系统级别的 cron
不常用,以及不建议通过直接修改文件的方式布置 cron
,故着重说明 crontab
命令的用法。
常用参数
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
基本格式
f1 f2 f3 f4 f5 command
f1表示分钟0~59 每分钟用*或者 */1表示。
f2表示小时0~23(0表示0点)。
f3表示日期1~31。
f4表示月份1~12。
f5表示星期0~7(0和7表示星期天)。
command表示要运行的命令。
# 具体可参照第一节的文件格式。
示例
# 每晚的21:30重启apache。
30 21 * * * /usr/local/etc/rc.d/lighttpd restart
# 每月1、10、22日的4:45重启apache。
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
# 每周六、周日的1:10重启apache。
10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
# 每天18:00至23:00之间每隔30分钟重启apache。
0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
# 每星期六的11:00 pm重启apache。
0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
# 每一小时重启apache。
* */1 * * * /usr/local/etc/rc.d/lighttpd restart
# 晚上11点到早上7点之间,每隔一小时重启apache。
* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
# 每月的4号与每周一到周三的11点重启apache。
0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
# 一月一号的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.
发送邮件
mail [-s 'title']username[@hostname]
# 输入 "." 单独成行或者 "Ctrl+d" 进行提交发送。
# 发送邮件给自己
ubuntu@huangzhongzhang:~$ mail -s test ubuntu
Just test!
.
ubuntu@huangzhongzhang:~$
以上命令只能是交互式进行发送,我们可以使用输入重定向或管道的方式让其可以在脚本中自动发送,比如:
# 输入重定向
mail -s 'title' hzz < /etc/fstab
# 通过管道
echo "hello"|mail -s 'title' hzz
接收邮件
接收邮件比较简单,执行 mail
,输入邮件编号即可:
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
categories:
- 学习笔记
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
以便恢复因关机而遗漏的任务,建议设置成开机执行。
配置
[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 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 任务列表),未超过则不执行。
命令参数
anacron [-sfn] [job]..
anacron -u [job]..
选项与参数:
-s :开始一连续的执行各项工作 (job),会依据时间记录档的资料判断是否进行;
-f :强制进行,而不去判断时间记录档的时间戳记;
-n :立刻进行未进行的任务,而不延迟 (delay) 等待时间;
-u :仅更新时间记录档的时间戳记,不进行任何工作;
job :由 /etc/anacrontab 定义的各项工作名称。
参考
anacron
在服务器上不常用(因为服务器不可能隔三岔五地关机或重启),更多地是使用在 PC 端的 Linux 上面,由于平时很少见也很少用,所以就不多作介绍了,更多信息可参考下面的文章。