定时任务是实现重复的工作,让系统自动完成,
设置定时任务的方法
方法一:使用 cronie 软件可以设置定时任务
方法二:使用atd软件可以说设置定时任务 和闹钟类似,需要每次都设置
方法三:使用anacron 软件设置定时任务 设置时间不够灵活
anacron是系统自带的,在 /etc/cron* 开头的文件
1. /etc/cron.daily - - - 每天定时执行(24小时周期)
2. /etc/cron.hourly - - - 每小时执行
3. /etc/cron.monthly - - - 每月定时执行
4. /etc/cron.weekly - - - 每周定时执行
这里重点使用方法一:
cronie 这个软件就是软件包名,没有的话# yum install cronie
就可以下载了
编辑定时任务:# crontab -e
直接进入编辑,不过格式我们先看一下
格式在 /etc/crontab 文件中有写到
最主要的就是下面的那行带星号的
- 第一个星号:表示分钟 (0-59)
- 第二个星号:表示小时 (0-23)
- 第三个星号:表示天数 (1-31)
- 第四个星号:表示月份 (1-12)
- 第五个星号:表示星期/周(1-7)(0-6 国外人习惯用这个方式,0表示星期天)
- 后面写上需要操作的命令即可
定时任务的定点设置:
设置定时任务文件:# crontab -e
- - - 进入编辑
图片中表示每天的凌晨2点就会备份这个文件
0 02 * * * cp /etc/hostname /etc/hostname.bak
定时任务可以精确到分钟
表示每天的凌晨2:30分会备份这个文件
30 02 * * * cp /etc/hostname /etc/hostname.bak
间接性定时任务
可以设置一个每隔多久时间的操作一次定时任务
表示每隔2隔小时操作一次后面的命令,但是这里的每隔2小时是整数倍执行,2点 4点 6点 以此类推的时间备份。不会3点,5点的时间备份
* */2 * * * cp /etc/hostname /etc/hostname.bak
时间段内执行定时任务
设置一个时间段内执行定时任务
表示8点到14点执行后面的命令
0 8-14 * * * cp /etc/hostname /etc/hostname.bak
指定时间多次执行定时任务
比如需要这个定时任务,需要9点,10点,12点各执行一次
0 9,10,12 * * * cp /etc/hostname /etc/hostname.bak
特殊时间表示方式
符号\作用 | 作用 |
---|---|
* | 表示每(每分钟,每天) |
*/n | 隔多久 |
n-m | 连续时间范围 |
n,m | 不连续时间范围 |
检查操作
设置完定时任务后,可以修改时间查看一下效果,在哪里能看见效果呢,cron的日志文件。(虚拟机上改就算了,别再生产环境下搞这个,就算搞了多学学跑路技巧)
# tail -f /var/log/cron
Dec 26 15:01:02 mingbab CROND[15805]: (root) CMD (run-parts /etc/cron.hourly)
Dec 26 15:01:02 mingbab run-parts(/etc/cron.hourly)[15805]: starting 0anacron
Dec 26 15:01:02 mingbab run-parts(/etc/cron.hourly)[15814]: finished 0anacron
Dec 26 16:01:01 mingbab CROND[15831]: (root) CMD (run-parts /etc/cron.hourly)
使用这个命令就可以实时查看cron的日志文件
以空格做分割符号:
第一二三列:定时任务触发时间信息
第四列:定时任务执行主机名称
第五列:定时任务触发方式1. ROND:配置定时任务
2. anacron:系统默认定时任务
最后列:执行任务信息
定时任务配置规范
编写定时任务规范
命令信息定时任务
第一步:先测试任务命令的命令进行测试# cp /etc/hostname /etc/hostname.bak # ll /etc/hostname* -rw-r--r-- 1 root root 8 Dec 11 10:11 /etc/hostname -rw-r--r-- 1 root root 8 Dec 26 16:44 /etc/hostname.bak
第二步:之后再编写定时任务
#crontab-e 30 02 * * * cp /etc/hostname /etc/hostname.bak
第三步:测试定时任务是否执行
tail -f /var/log/cron
脚本信息定时任务
第一步:先写一个脚本文件vim test.sh cp /etc/hostname /etc/hostname.bak --- 这是内容
第二步:测试检查脚本执行脚本
# sh test.sh # ll /etc/hostname* -rw-r--r-- 1 root root 8 Dec 11 10:11 /etc/hostname -rw-r--r-- 1 root root 8 Dec 26 16:58 /etc/hostname.bak
第三步:写定时任务
#crontab-e 30 02 * * * sh /root/test.sh #这个路径需要写绝对路径
第四步:测试定时任务是否执行
#tail -f /var/log/cron
定时任务常见问题
第一个:使用定时任务,内容携带命令时,要使用绝对路径
先测试命令需要执行的命令#ntpdate ntp1.aliyun.com
再编写定时任务
#crontab -e */5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com
最后确认检查
# tail -f /var/log/cron
第二个:定时任务执行命令无法识别特殊的符号
比如备份一个数据名称需要有时间的信息
咱们先测试命令# cp /etc/hostname /etc/hostname_$(date "+%F")
在编写定时任务信息
#crontab -e * * * * * cp /etc/hosts /backup/hosts_$(date "+%F")
检查定时任务
# crontab -e
会在日志中看到这条信息:无法解析百分号
Dec 26 19:30:01 mingbab CROND[16476]: (root) CMD (cp /etc/hosts /backup/hosts_$(date "+)
定时任务编辑命令行特殊符号时不能识别
解决办法:1.在无法解析的符号前添加 \ 反斜杠* * * * * cp /etc/hosts /backup/hosts_$(date "+\%F")
- 或者使用脚本编辑定时任务,参考上面的步骤
第三个:定时任务产生的输出信息会占用磁盘空间
解决方法:可以将输出的信息重定向到系统黑洞中* * * * * cp /etc/hosts /backup/hosts.bak &>/dev/null * * * * * cp /etc/hosts /backup/hosts.bak >/dev/null 2>&1
第四个:编写的定时任务最好都加上注释信息,让人知道这条定时任务是做什么的