目录
- 目录
- 介绍
- 安装并检查Crontab服务
- 入门栗子
- Crontab的基本组成
- 用户任务调度
- crontab命令的使用及相关文件
- Crontab的任务配置格式
- 系统任务调度
- 系统级任务调度与用户级任务调度
- 注意事项
- 参考
介绍
Crontab是什么?
Crontab是一个用于设置周期性被执行的任务的工具。最短周期可设置为每分钟执行一次。其中,被周期性执行的任务我们称为Cron Job。周期性执行的任务列表我们称为Cron Table。
安装并检查Crontab服务
- 检查crontab服务
- 检查crond服务是否启动:
service crond status
。 - 检查crontab工具是否安装:
crontab -l
。(实际上这个命令是查看crontab的正在周期执行的任务)
- 安装cron(一般情况下CentOS均安装了Crontab,无需再次安装)
-
yum install vixie-cron
-
yum install crontabs
入门栗子
- 每分钟都打印当前时间到一个日志文件中。操作如下:
(1)设置周期执行的任务:
crontab -e
// 在最后加上如下设置
*/1 * * * * date >> /tmp/log.txt
(2) 查看设置的任务,确认是否设置成功:
crontab -l
(3) 查看log.txt
文件是否每分钟记录一次当前时间:
tail -f /tmp/log.txt
(tail
命令用于查看文件底部最后几行的内容。普通的tail
命令无法实时查看文件内容的变化情况,需要加入-f
参数。如果需要设置查看的行数,可以如tail -10 /tmp/log.txt
查看最后10行这样设置。)
Crontab的基本组成
- 构成Crontab最主要的组成部分是crond系统服务,该服务每分钟都会从配置文件刷新定时任务。没有该服务也就没有任务的定时执行,所以该服务十分关键。
- 配置文件,任务的定义是以文件方式保存的。我们通过配置文件设置定时任务。
- 除此之外,为了调整定时任务,还需要一个配置工具,这个配置工具就是crontab。
值得注意的是,Linux下的任务调度分为系统任务调度和用户任务调度。而之前举的入门栗子中设置的便是用户任务调度。
用户任务调度
用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。所有用户定义的crontab文件(记录着用户定义的crontab任务列表的文件)都被保存在/var/spool/cron
目录中,以用户名为文件名保存对应用户定义的crontab文件。Crontab服务便是从这些配置文件中读取任务列表,执行任务的。
用户可以使用 Crontab 工具来定制自己的计划任务。下面讲解一下crontab命令的使用及相关文件。
crontab命令的使用及相关文件
crontab命令
usage: crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]
命令参数:
-
-u 用户名
:用于指定后续操作的是哪个用户的crontab任务。该参数一般是root用户来运行。不指定-u
参数则默认crontab
命令操作的是当前用户的crontab任务。 -
file
:其中file指的是一个任务列表配置文件,我们可以通过文件的形式载入任务。其中文件的内容,如:
*/1 * * * * date >> /tmp/log.txt
45 4 1-10 * * service httpd restart
# 这里面定义了多个任务
-
-e
:添加crontab任务。实际上这里是操作的/var/spool/cron/用户名
文件的内容。因此,如果我们直接修改(如果有权限的话)/var/spool/cron/某个用户的用户名
的内容的话,相当于为该用户定义任务列表。 -
-l
:查看crontab任务列表。实际上这里查看的是/var/spool/cron/用户名
文件的内容。如果没有使用-u
参数指定用户名的话,这里的“用户名”指的是当前用户的用户名。 -
-r
:删除用户的crontab。实际上这里删除的就是/var/spool/cron/用户名
这一份crontab任务配置文件。因此,我们在实际添加crontab任务的时候,一般是以文件的形式导入,导入成功后会在/var/spool/cron/
目录下生成对应用户的任务配置文件。如果因为该命令误删了用户定义的crontab任务,也不至于丢失原来的任务信息。因为我们保留了原文件。 -
tail -f /var/log/cron
:查看crontab任务执行记录。 -
tail -f /var/spool/mail/用户名
:以邮件形式发送任务的执行信息给任务所属用户。
可见,设置用户的crontab任务,关键的是用户对应的/var/spool/cron/用户名
这一crontab任务配置文件。
Crontab的任务配置格式
* * * * * command to be executed
| | | | |
| | | | .---- 星期0~7(0或者7表示星期天) OR sun,mon,tue,wed,thu,fri,sat
| | | .------- 月份1~12 OR jan,feb,mar,apr ...
| | .---------- 日期1~31
| .------------- 小时0~23
.---------------- 分钟0~59
栗子:
- 每晚的21:30重启apache
30 21 * * * service httpd restart
- 每月1、10、22日的4:45重启apache
45 4 1,10,22 * * service httpd restart
- 每月1到10日的4:45重启apache
45 4 1-10 * * service httpd restart
- 每隔两分钟重启apache
*/2 * * * * service httpd restart
- 1-59分钟间每隔两分钟重启apache
1-59/2 * * * * service httpd restart
- 晚上11点到早上7点之前,每隔一小时重启apache
0 23-7/1 * * * service httpd restart
- 每天18:00至23:00之间每隔30分钟重启apache
0,30 18-23 * * * service httpd restart
0-59/30 18-23 * * * service httpd restart
*/30 18-23 * * * service httpd restart
总结
- *表示任何时候都匹配
- 可以用“A,B,C”表示A或者B或者C时执行命令
- 可以用“A-B”表示A到B之间时执行命令
- 可以用“*/A”表示每A分钟(小时等)执行一次命令
系统任务调度
系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。/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
其中,第三行MAILTO变量指定了cron的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户。在这个文件中配置的所有任务的执行信息都只会发送给MAILTO变量配置了的用户。如root用户,那么root用户可以通过tail -f /var/spool/mail/root
查看邮件形式的任务执行信息。
这里主要关注的是crontab任务的配置。在文件的内容中我们可以从注释看出:
# * * * * * user-name command to be executed
系统crontab和用户crontab任务的配置大致一样。不同的是系统crontab任务需要设置user-name
用户名的值,指明系统crontab任务所属用户。其他参数的使用同上述提及的任务的配置。采用crontab
相关命令都并不影响系统crontab任务的配置。系统crontab任务的配置均通过/etc/crontab
该配置文件来操作。操作正确后crontab任务立即生效。
系统级别的crontab任务同样也可以通过tail -f /var/log/cron
命令查看crontab任务执行记录。
此外,还有另外几个文件的说明。
/etc/cron.deny
:该文件中所列用户不允许使用crontab命令。(在文件中设置用户名)此时如果用户使用crontab命令,会显示如下提示:
[wml@localhost ~]$ crontab -l
You (wml) are not allowed to use this program (crontab)
See crontab(1) for more information
/etc/cron.allow
:该文件中所列用户允许使用crontab命令。(在文件中设置用户名)
系统级任务调度与用户级任务调度
系统级任务调度主要完成系统的一些维护操作,用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议这么做),但是反过来却不行,root用户的任务调度操作可以通过“crontab –uroot –e
”来设置,也可以将调度任务直接写入/etc/crontab
文件,需要注意的是,如果要定义一个定时重启系统的任务,就必须将任务放到/etc/crontab
文件,即使在root用户下创建一个定时重启系统的任务也是无效的。(摘自:每天一个linux命令(50):crontab命令)
注意事项
(1)任务配置中第三和第五个域之间执行的是“或”操作。如:
四月的第一个星期日早晨1时59分运行a.sh
59 1 1-7 4 0 /root/a.sh
上面的写法是错误的。这样写的意思则表示:四月的1到7号或者四月的星期日,它们中的早晨1时59分运行a.sh。正确写法应该是不设置第五个域,并在执行脚本前判断当天是否为星期日。如下:
59 1 1-7 4 * test `date +\%w` -eq 0 && /root/a.sh
对于命令date +%w
来说并不需要添加\
,在crontab任务中则需要添加。
或:
59 1 1-7 4 * test `date +\%w` = 0 && /root/a.sh
注意这里“=”两边需要有空格。为什么?test命令判断后面的条件是否成立。
echo $?
命令返回的是上个命令的结果。如果返回值是0,就是上个命令执行成功;如果是返回值是0以外的值,就是失败。
对于test 1=0
命令,来说总是成功的,即返回0。实际上我们认为0并不等于1。我们需要使用test 1 = 0
。如下:
test 1 = 0
echo $?
(2)Crontab中最小只能设置到每分钟执行一次命令,如果想每半分钟执行某个命令怎么做到呢?
采用sleep,让命令执行时暂停。如:
*/1 * * * * date >> /tmp/date.log
*/1 * * * * sleep 30s; date >> /tmp/date.log
如果需要控制的粒度更小,可以查看下述的操作文章。
参考
- 每天一个linux命令(50):crontab命令
- linux crontab 实现每秒执行