Crontab命令常见于Unix和类Unix的操作系统中,用于设置周期性被执行的指令,让重复的任务自动化执行。本文主要是对我在学习Crontab时做的一些总结。
1.应用背景:
- 每分钟需要执行一个程序检查系统运行状态
- 每天凌晨需要对过去一天的业务数据进行统计
- 每个星期需要吧日志文件备份
- 每个月需要把数据库进行备份
2.CRONTAB
Crontab是一个用于设置周期性被执行的任务的工具。
其中,被周期性执行的任务称为Cron Job;周期性执行的任务列表称为Cron Table
3.Crontab实践
- 相关工具
- 安装并检查Crontab服务
- Crontab的基本组成
- Crontab的配置文件格式
- Crontab工具的使用
- Crontab的日志
- Crontab常见错误
(1)相关工具
用于远程连接Linux操作系统的远程登录工具很多,常用的有:
- Putty
- Xshell
- Secure crt
(2)安装并检查Crontab服务
- 检查cron服务:
- –检查Crontab工具是否安装:crontab -l
- –检查crond服务是否启动:service crond status
- 安装cron
- yum install vixie-cron
- yum install crontabs
(3)示例
每分钟都打印当前时间到一个日志文件中:
1)crontab -e #打开定时任务列表文件,进行编辑,输入如下内容:
1 |
*/1 * * * * date >> /tmp/log.txt |
输入之后,可以通过命令crontab -l 查看任务列表。
2)tail /tmp/log.txt #查看日志文件中是否定期打印时间:
1 2 3 4 5 6 7 8 |
# tail /tmp/log.txt Thu Jun 15 08:53:01 CST 2017 Thu Jun 15 08:54:01 CST 2017 Thu Jun 15 08:55:01 CST 2017 Thu Jun 15 08:56:01 CST 2017 Thu Jun 15 08:57:01 CST 2017 Thu Jun 15 08:58:01 CST 2017 Thu Jun 15 08:59:01 CST 2017 |
其中,如果使用tail -f命令,将一直等待日志文件的写入(常用)。
(4)Crontab的基本组成
- CROND(系统服务)——每分钟都会从配置文件刷新定时任务。
- 配置文件——以文件方式设置定时任务。
- crontab(配置工具)——用于调整定时任务。
(5)Crontab的配置文件格式
* * * * * COMMAND
- 第一个*:分钟0-59
- 第二个*:小时0-23
- 第三个*:日期1-31
- 第四个*:月份1-12
- 第五个*:星期0-7(0或7表示星期天)
示例:
1)每晚的21:30重启apache
1 |
30 21 * * * service httpd restart |
2)每月1、10、22日的4:45重启apache
1 |
45 4 1,10,22 * * service httpd restart |
3)每月的1到10日的4:45重启apache
1 |
45 4 1-10 * * service httpd restart |
4)每隔两分钟重启apache服务器
1 |
*/2 * * * * service httpd restart |
5)奇数分钟的时候重启apache
1 |
1-59/2 * * * * service httpd restart |
6)晚上11点到早上7点之间,每隔一小时重启apache
1 |
0 23-7/1 * * * service httpd restart |
注意,第一个星号位被置为了0,若不置为0,则表示在23-7点之间任何一分钟都会执行。
7)每天18:00至23:00之间每隔30分钟重启apache
1 2 3 |
0,30 18-23 * * * service httpd restart 或者 0-59/30 18-23 * * * service httpd restart |
小结:
- *表示任何时候都匹配
- 可以用“A,B,C”表示A或者B或者C时执行命令
- 可以用“A-B”表示A到B之间时执行命令
- 可以用“*/A”表示每A分钟(小时等)执行一次命令
(6)Crontab工具的使用
使用crontab -help查看相关命令,其中最常用的命令有两个:
crontab -e
crontab -l
tail -f /var/log/cron #查看cron的log文件
(7)Crontan配置文件
1)全局(系统)配置文件:/etc/crontab
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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 |
也可以在该文件中加入计划任务,不同之处在于:一般认为,通过crontab -e输入的计划任务称为用户级的计划任务;而通过/etc/crontab输入的计划任务称为系统级的计划任务。
2)此外,还要注意一点,前面示例我们都是直接通过命令crontab -e命令来进行编辑的,而在/etc/cron.d/目录下有一个sysstat文件。
如果修改了sysstat文件并执行命令crontab sysstat,那么再通过crontab -e编辑文件,其内容将变成sysstat文件的内容,即你先前单独在crontab -e下编辑的计划任务就丢失了。
说这些的原因是,当我们在工作中,编辑计划任务时最好不要通过crontan -e的方式,而是通过:crontab [options] file 指明一个文件的形式,防止先前的计划丢失。
3)/var/spool/cron/root
crontab操作的文件其实就是/var/spool/cron/root文件,通过如下两个命令对比:
1 2 3 4 5 6 7 8 9 10 11 12 |
[root@VM_198_209_centos cron.d]# crontab -l #secu-tcs-agent monitor, install at Tue Mar 22 12:25:14 CST 2016 * * * * * /usr/local/sa/agent/secu-tcs-agent-mon-safe.sh > /dev/null 2>&1 */1 * * * * /usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 & */20 * * * * /usr/sbin/ntpdate ntpupdate.tencentyun.com >/dev/null & [root@VM_198_209_centos cron.d]# cat /var/spool/cron/root #secu-tcs-agent monitor, install at Tue Mar 22 12:25:14 CST 2016 * * * * * /usr/local/sa/agent/secu-tcs-agent-mon-safe.sh > /dev/null 2>&1 */1 * * * * /usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 & */20 * * * * /usr/sbin/ntpdate ntpupdate.tencentyun.com >/dev/null & |
(8)Crontab的日志
/var/log/cron文件保存着cron的任务执行记录。