一、概述
本篇文章思维导图
1.1 crontab命令简介
有时候我们需要在linux系统中定时执行一些命令,比如说定时执行监控脚本来检测某个服务是否正常,不正常的话就把服务拉起,这个时候就会用到crontab命令了。
crontab命令,一般在Linux系统中用来设置被周期性执行的任务,将任务存放于crontab文件中。crontab命令依赖crond服务,只有安装了crond服务,crontab命令才能使用,一般在安装操作系统时,crond服务会被默认安装,并且会自动启动。crond进程每分钟会定期查看crontab文件中的任务列表检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
操作
依赖
读取
crontab命令
crontab文件
crond服务
总结: 只有安装了crond服务以后crontab命令才能使用,crontab命令按照指定的格式编辑定时任务保存在crontab文件中,crond服务会每分钟定期查看crontab文件中的定时任务列表去执行任务。
1.2 linux定时任务分类
Linux 系统下的任务调度分为两类:系统任务调度和用户任务调度。
- 系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。
- 用户任务调度:用户自定义的定期要执行的工作,用户可以使用 crontab 工具来定制自己的计划任务,所有用户自定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致,例如我用test用户设置了一个定时任务,那么其对应的crontab文件就是 /var/spool/cron/test。
总结:系统级别的定时任务crontab文件是/etc/crontab,用户自定义的定时任务其crontab文件保存在 /var/spool/cron/ 目录下,名字和用户名一致。
二、用法详解
2.1 crond服务安装
一般情况下crond服务在安装系统的时候会被默认安装,并自动运行。
centos7系统下检查服务是否安装
检查是否安装:systemctl status crond
如果显示 Unit crond.service could not be found.,则需要安装crond服务。
crond安装:yum -y install crontabs
启动crond服务: systemctl start crond
crond设置开机自启动: systemctl enable crond
2.2 crontab文件中的任务格式
前面说了用crontab命令可编辑定时任务,保存在crontab文件中,下面我们就来看一下定时任务的格式是什么样子的呢?
可以执行命令: cat /etc/crontab 看下示例:
[root@vm1 ~]# 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
文件前三行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户。
我们重点关注一下最后一行:
* * * * * user-name command to be executed
就是通过设置crontab文件中的这五个 * 来确定任务的执行时间的, user-name是执行任务的用户,command to be executed 是要执行的命令或者脚本任务,我们具体来看下这五个 * 所代表的含义。
项目 | 含义 | 取值范围 |
第一个* | 一小时当中的第几分钟(minute) | 0~59 |
第二个* | 一天当中的第几小时(hour) | 0~23 |
第三个* | 一个月当中的第几天(day) | 1~31 |
第四个* | 一年当中的第几个月(month) | 1~12 |
第五个* | 一周当中的星期几(week) | 0~7(0和7都代表星期日) |
举个例子:
20 23 * * * root systemctl restart httpd
上面的格式就表示:每天的 23:20 都会定时重启一次apache服务。
那么如果我想某个任务每隔5分钟就执行一次,该怎么设置呢?
其实,除了*这个字符之外还有其他的特殊字符,用来满足不同的定时需求。
特殊符号 | 含义 | 举例说明 |
*(星号) | 表示任何时间 | 例如: * 8 * * * ,表示每天8点的每一分钟都执行一次命令 |
,(逗号) | 用逗号隔开表示该字段的取值 | 例如:10 8,10,12 * * * ,表示在每天的8:10,10:10,12:10都会执行一次命令 |
-(中杠) | 表示两个整数之间的取值范围 | 例如:10 8 * * 1-3 ,表示每周一到周三的8:10 执行一次命令 |
/(正斜线) | 表示间隔多久执行一次 | 例如: * /10 * * * * ,表示每隔10分钟就执行一次命令 |
2.3 crontab常用命令
了解了crontab文件的格式之后,我们看下怎么用crontab命令来编辑crontab文件。
crontab命令的基本格式如下:
crontab [选项]
crontab [选项] file
常用选项及功能
选项 | 功能 |
-u user | 用来设定某个用户的 crontab 服务,例如 -u test 表示设置 test用户的 crontab 服务,此选项一般只有 root 用户有权限来运行 |
-e | 编辑某个用户的 crontab 文件内容,如果不指定用户,则表示编辑当前用户的 crontab 文件 |
-l | 显示某用户的 crontab 文件内容,如果不指定用户,则表示显示当前用户的 crontab 文件内容 |
-r | 从 /var/spool/cron 删除某用户的 crontab 文件,如果不指定用户,则默认删除当前用户的 crontab 文件 |
-i | 在删除用户的 crontab 文件时,给与确认提示 |
其实在实际使用中,设置 crontab 定时任务非常简单,切换到需要执行命令的用户,然后只需执行crontab -e命令,然后会打开一个空文件,然后输入想要定时执行的任务即可。
[test@vm1]# crontab -e
#进入 crontab 编辑界面。会打开Vim编辑你的任务
*/10 * * * * /home/test/test.sh
编辑完保存之后,就会在 /var/spool/cron/ 目录生成一个名字叫test文件,这个文件就是test用户的crontab文件。
说明:在crontab [选项] file 命令中, file 指的是命令文件的名字,表示将 file 作为 crontab 的任务列表文件并载入 crontab,若在命令行中未指定文件名,则此命令将接受标准输入(键盘)上键入的命令,并将它们键入 crontab, 例如:crontab -u test /root/jobs.txt ,表示用/root/jobs.txt 这个文件中的任务列表载入crontab。
三、相关文件
3.1 crontab日志文件
想查看定时任务的执行情况,直接查看 /var/log/cron文件就可以了。
[root@vm1 log]# tail -500f /var/log/cron
3.2 crontab权限文件
如果你不想让某个用户拥有执行定时任务的权限,你可以用编辑 /etc/cron.deny文件来限制用户。
[root@vm1 log]# vim /etc/cron.deny
#把要限制的用户一行一个写在里面保存即可。
test
四、使用注意事项
4.1 优先使用crontab -e
编辑 /etc/crontab文件和使用crontab -e 命令都可以执行定时任务,/etc/crontab文件只有root用户才能编辑,如果非系统级别的配置,执行的只是个人用户的一些任务,应该优先使用crontab -e命令。
这里需要注意的是: /etc/crontab文件和使用crontab -e 命令稍微有些不同!
/etc/crontab 格式: * * * * * user-name command to be executed
crontab -e 格式: * * * * * command to be executed
可以看出crontab -e 比/etc/crontab格式中少了一个user-name,因此在使用crontab -e时,不要加入user-name选项了,不然会导致定时任务无法运行!
4.2 谨慎使用crontab -r命令
crontab -r 命令会删除用户在 /var/spool/cron 下的crontab文件,即该用户下所有的定时任务都会被删除。如果只是想删除某个定时任务,用crontab -e 命令编辑crontab文件删除某个任务即可。
4.3 定时任务不执行原因
定时任务设置的格式正确,手动执行也没问题,但是定时任务就是不执行,这种情况的出现,一般是由下面几个原因造成的。
- crond服务未启动
需要首先排查下crond服务是否启动,可使用systemctl status crond 命令查看,如果未启动,则启动即可。 - 脚本无权限
如果要执行脚本无权限,通过chmod命令加上权限即可。 - 文件路径问题
定时任务要执行的脚本中涉及文件路径时,一定要写全局路径,不能写相对路径。
例如:
[test@vm1]# cat test.sh
#!/bin/bash
java -jar /home/test/test.jar
在test脚本中一定要写test.jar 文件的全局路径。
- 环境变量问题
定时任务要执行的脚本要用到java或其他环境变量时,需要通过source命令引入环境变量。
例如:
[test@vm1]# cat test.sh
#!/bin/bash
source /etc/profile
java -jar /home/test/test.jar