教你们学习一个最简单又企业最需要的服务-crond
第13章 定时任务的介绍
13.1 定时任务的分类
13.1.1 系统实现定时任务的配置
[root@oldboyedu ~] # cd /etc/cron.
cron.d/ cron.daily/ cron.hourly/ cron.monthly/ cron.weekly/
[root@oldboyedu ~] # cd /etc/cron.
cron.daily 每天定时执行同步任务
cron.hourly 每小时定时执行同步任务
cron.monthly 每个月定时执行同步任务
cron.weekly 每星期定时执行同步任务
cron.deny 限制哪些用户不可以使用定时任务进行配置
13.1.2 用户自定义定时任务的配置(-个命令,俩个文件)
13.3.1.1 一个命令
crontab -l:查看配置的定时任务
[root@oldboyedu ~] # crontab -l
30 2 * * * cp -rf /etc/hosts /etc/hosts.bak
[root@oldboyedu ~] #
crontab -e:编写定时任务
[root@oldboyedu ~] # crontab -e
no crontab for root - using an empty one
30 2 * * *
crontab -r:清空定时任务配置的任务信息
[root@oldboyedu ~] # crontab -l 查看定时任务信息
#30 */1 * * * cp /etc/hosts /etc/hosts_lyx.bak
#*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com
#*/5 * * * * sh /server/scripts/ntpdate_sync.sh & > /dev/null
#* * * * * tar zcvf /opt/hosts_$(date +\%F).tar.gz /etc/hosts
#* * * * * sh /server/scripts/tar_sync.sh & >/dev/null
[root@oldboyedu ~] # crontab -r 清除定时任务信息
[root@oldboyedu ~] # crontab -l 再次查看发现已经没有信息
no crontab for root
[root@oldboyedu ~] #
13.1.1.2 俩个文件
13.1.1.2.1 root用户设置定时任务的配置文件
[root@oldboyedu ~] # ll /var/spool/cron/root root用户设置定时任务的配置文件
-rw------- 1 root root 44 Oct 2 15:25 /var/spool/cron/root
[root@oldboyedu ~] #
13.1.1.2.2 root用户定时任务的日志文件
[root@oldboyedu ~] # tail -f /var/log/cron root用户定时任务的日志文件
Oct 2 19:30:01 oldboyedu CROND[8172]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Oct 2 19:40:01 oldboyedu CROND[8258]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Oct 2 19:50:01 oldboyedu CROND[8345]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Oct 2 20:00:01 oldboyedu CROND[8431]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Oct 2 20:01:02 oldboyedu CROND[8444]: (root) CMD (run-parts /etc/cron.hourly)
Oct 2 20:01:02 oldboyedu run-parts(/etc/cron.hourly)[8444]: starting 0anacron
Oct 2 20:01:02 oldboyedu run-parts(/etc/cron.hourly)[8453]: finished 0anacron
- Oct 2 20:01:02 产生定时任务信息的时间
- oldboyedu 用户主机名
- run-parts(/etc/cron.hourly)[8453] 读取什么定时任务信息
- finished 0anacron 具体执行的任务
13.1.3 定时任务atd的描述(此了解即可)
atd每天只能执行at命令一次,不能循环使用
13.2 定时任务的表示方式
13.2.1 书写方式
* * * * * 接文件和脚本
13.2.2 每个*号代表的意思
第一个* 分(0-59) (每分钟)
第二个* 小时(0-23) (每小时)
第三个* 天数(1-31) (每天)
第四个* 月数(1-12) (每月)
第五个* 周数(0-6) (每周)
警告:天数和周数不能同时指定
13.2.3 例子
- 5 * * * * 指定每小时的第5分钟执行一次
- 30 5 * * * 指定每天的 5:30 执行
- 30 7 8 * * 指定每月8号的7:30分执行
- 30 5 8 6 * 指定每年的6月8日5:30执行
-
30 6 * * 0 指定每星期日的6:30执行[注:0表示星期天,1表示星期1,
以此类推,也可以用英文来表示,sun表示星期天,mon表示星期一等。
- 30 3 10,20 * * 每月10号及20号的3:30执行[注:","用来连接多个不连续的时段
- 25 8-11 * * * 每天8-11点的第25分钟执行[注:"-"用来连接连续的时段
- */15 * * * * 每15分钟执行一次 [即每个小时的第0 15 30 45 60分钟执行
- 30 6 */10 * * 每个月中,每隔10天6:30执行一次[即每月的1、11、21、31日是的6:30执行一次
13.3 定时任务常见的几种表示方法
*/n 表示出现n的倍数/小时/天/月/周
n-m 表示在n-m的时间段内进行备份
n,m 表示在n和m的时间段内进行备份
n-m/2 表示在n-m时间段内每隔2个小时进行备份
13.3.1 在2点30分的时候备份/etc/hosts文件
13.3.1.1 编写定时任务配置
[root@oldboyedu ~] # crontab -l
30 2 * * * cp /etc/hosts /etc/hosts_lyx.bak
[root@oldboyedu ~] #
13.3.1.2 修改时间为20191003 2:29:40
[root@oldboyedu ~] # date -s "20191003 2:29:40"
Thu Oct 3 02:29:40 CST 2019
[root@oldboyedu ~] # date
Thu Oct 3 02:29:42 CST 2019
13.3.1.3 查看日志
[root@oldboyedu ~] # tail -f /var/log/cron 查看定时任务日志
Oct 2 21:03:23 oldboyedu crontab[9129]: (root) REPLACE (root)
Oct 2 21:03:23 oldboyedu crontab[9129]: (root) END EDIT (root)
Oct 3 02:30:21 oldboyedu crontab[9180]: (root) LIST (root)
Oct 3 02:30:27 oldboyedu CROND[9183]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Oct 3 02:30:27 oldboyedu CROND[9184]: (root) CMD (cp /etc/hosts /etc/hosts_lyx.bak)
13.3.1.4 查看配置是否成功
[root@oldboyedu ~] # ll /etc/hosts_lyx.bak 备份成功
-rw-r--r-- 1 root root 158 Oct 3 02:30 /etc/hosts_lyx.bak
[root@oldboyedu ~] #
13.3.2 每小时的第30分钟进行备份文件/etc/hosts文件
13.3.2.1 编写定时任务配置
[root@oldboyedu ~] # crontab -e
30 */1 * * * cp /etc/hosts /etc/hosts_lyx.bak
13.3.2.2 修改时间
[root@oldboyedu ~] # date -s "20191003 9:29:50" 修改时间为9点29分40秒
Thu Oct 3 09:29:50 CST 2019
[root@oldboyedu ~] # date
Thu Oct 3 09:29:52 CST 2019
13.3.2.3 查看日志
[root@oldboyedu ~] # tail -f /var/log/cron 查看日志备份成功
Oct 3 02:37:47 oldboyedu crontab[9242]: (root) REPLACE (root)
Oct 3 02:37:47 oldboyedu crontab[9242]: (root) END EDIT (root)
Oct 3 02:38:01 oldboyedu crond[1269]: (root) RELOAD (/var/spool/cron/root)
Oct 3 09:30:27 oldboyedu CROND[9296]: (root) CMD (cp /etc/hosts /etc/hosts_lyx.bak)
Oct 3 09:30:27 oldboyedu CROND[9297]: (root) CMD (/usr/lib64/sa/sa1 1 1)
13.3.2.4 查看配置是否成功
[root@oldboyedu ~] # ll /etc/hosts_lyx.bak
-rw-r--r-- 1 root root 158 Oct 3 09:30 /etc/hosts_lyx.bak
[root@oldboyedu ~] #
13.3.3 在每天的9点,10点.11点的30分钟的时候进行文件/etc/hosts文件备份
13.3.3.1 编写定时任务配置
[root@oldboyedu ~] # crontab -e
30 9-11 * * * cp /etc/hosts /etc/hosts_lyx.bak
13.3.3.2 修改时间
[root@oldboyedu ~] # date -s "20191003 9:29:50" 修改时间为9点29分40秒
Thu Oct 3 09:29:50 CST 2019
[root@oldboyedu ~] # date
Thu Oct 3 09:29:52 CST 2019
13.3.3.3 查看日志
[root@oldboyedu ~] # tail -f /var/log/cron 查看日志备份成功
Oct 3 02:37:47 oldboyedu crontab[9242]: (root) REPLACE (root)
Oct 3 02:37:47 oldboyedu crontab[9242]: (root) END EDIT (root)
Oct 3 02:38:01 oldboyedu crond[1269]: (root) RELOAD (/var/spool/cron/root)
Oct 3 09:30:27 oldboyedu CROND[9296]: (root) CMD (cp /etc/hosts /etc/hosts_lyx.bak)
Oct 3 09:30:27 oldboyedu CROND[9297]: (root) CMD (/usr/lib64/sa/sa1 1 1)
13.3.3.4 查看配置是否成功
[root@oldboyedu ~] # ll /etc/hosts_lyx.bak
-rw-r--r-- 1 root root 158 Oct 3 09:30 /etc/hosts_lyx.bak
[root@oldboyedu ~] #
13.3.4 下午3点40,8月6日,周日将数据进行备份
错误,这种写法错误
在定时任务的配置中,不能将日期和周进行同时配置
13.3.5 在每天的9点,11点的30分进行数据的备份
13.3.5.1 编写定时任务配置
[root@oldboyedu ~] # crontab -e
30 9,11 * * * cp /etc/hosts /etc/hosts_lyx.bak
13.3.3.2 修改时间
[root@oldboyedu ~] # date -s "20191003 9:29:50" 修改时间为9点29分40秒
Thu Oct 3 09:29:50 CST 2019
[root@oldboyedu ~] # date
Thu Oct 3 09:29:52 CST 2019
13.3.3.3 查看日志
[root@oldboyedu ~] # tail -f /var/log/cron 查看日志备份成功
Oct 3 02:37:47 oldboyedu crontab[9242]: (root) REPLACE (root)
Oct 3 02:37:47 oldboyedu crontab[9242]: (root) END EDIT (root)
Oct 3 02:38:01 oldboyedu crond[1269]: (root) RELOAD (/var/spool/cron/root)
Oct 3 09:30:27 oldboyedu CROND[9296]: (root) CMD (cp /etc/hosts /etc/hosts_lyx.bak)
Oct 3 09:30:27 oldboyedu CROND[9297]: (root) CMD (/usr/lib64/sa/sa1 1 1)
13.3.3.4 查看配置是否成功
[root@oldboyedu ~] # ll /etc/hosts_lyx.bak
-rw-r--r-- 1 root root 158 Oct 3 09:30 /etc/hosts_lyx.bak
[root@oldboyedu ~] #
13.4 定时任务常见的问题
13.4.1 每隔5分钟进行时间的同步(采用绝对路径)
13.4.1.1 错误示范
13.4.1.1.1 配置定时任务
[root@oldboyedu ~] # crontab -l
*/5 * * * * ntpdate ntp1.aliyun.com
You have new mail in /var/spool/mail/root
[root@oldboyedu ~] #
13.4.1.1.2 修改时间
[root@oldboyedu ~] # date -s "20191003 9:49:50"
Thu Oct 3 09:49:50 CST 2019
[root@oldboyedu ~] # date
Thu Oct 3 09:49:51 CST 2019
13.4.1.1.3 查看日志
[root@oldboyedu ~] # tail -f /var/log/cron
Oct 3 09:45:12 oldboyedu crontab[9480]: (root) REPLACE (root)
Oct 3 09:45:12 oldboyedu crontab[9480]: (root) END EDIT (root)
Oct 3 09:50:12 oldboyedu crond[1269]: (root) RELOAD (/var/spool/cron/root)
Oct 3 09:50:12 oldboyedu CROND[9502]: (root) CMD (ntpdate ntp1.aliyun.com)
Oct 3 09:50:12 oldboyedu CROND[9503]: (root) CMD (/usr/lib64/sa/sa1 1 1)
13.4.1.1.4 查看配置是否成功
[root@oldboyedu ~] # date
Thu Oct 3 09:50:31 CST 2019
[root@oldboyedu ~] #
结论;这样配置出来的时间没有进行同步
13.4.1.2 正确示范
利用命令的绝对路径来备份
13.4.1.2.1 采用绝对路径进行编写
[root@oldboyedu ~] # crontab -l
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com
13.4.1.2.2 修改时间
[root@oldboyedu ~] # date -s "20191003 9:29:50"
Thu Oct 3 09:29:50 CST 2019
[root@oldboyedu ~] # date
Thu Oct 3 09:29:51 CST 2019
13.4.1.2.3 查看日志
[root@oldboyedu ~] # tail -f /var/log/cron
Oct 3 09:57:21 oldboyedu crontab[9585]: (root) REPLACE (root)
Oct 3 09:57:21 oldboyedu crontab[9585]: (root) END EDIT (root)
Oct 3 09:29:59 oldboyedu crond[1269]: (root) RELOAD (/var/spool/cron/root)
Oct 3 09:30:01 oldboyedu CROND[9644]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Oct 3 09:30:01 oldboyedu CROND[9645]: (root) CMD (/usr/sbin/ntpdate ntp1.aliyun.com)
13.4.1.2.4 查看更新是否成功
[root@oldboyedu ~] # date
Wed Oct 2 21:40:43 CST 2019 更新成功
[root@oldboyedu ~] #
脚本完成
13.4.1.2.5 编写脚本
[root@oldboyedu ~] # cat /server/scripts/ntpdate_sync.sh 编写ntpdate_sync.sh脚本
#!/bin/bash
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
echo $PATH &>/tmp/oldboy.txt
ntpdate ntp1.aliyun.com
[root@oldboyedu ~] #
13.4.1.2.6 配置定时任务
[root@oldboyedu ~] # crontab -e
*/5 * * * * sh /server/scripts/ntpdate_sync.sh 将脚本配置到定时任务里面
13.4.1.2.7 修改时间
[root@oldboyedu ~] # date -s "20191004 11:00:40" 将时间修改为2019年10月4日11点
Fri Oct 4 11:00:40 CST 2019
[root@oldboyedu ~] # date
Fri Oct 4 11:00:41 CST 2019
[root@oldboyedu ~] # date
Fri Oct 4 11:00:42 CST 2019
13.4.1.2.8 查看日志
[root@oldboyedu ~] # tail -f /var/log/cron 查看日志发现脚本已经触发
Oct 3 10:56:46 oldboyedu crontab[2211]: (root) REPLACE (root)
Oct 3 10:56:46 oldboyedu crontab[2211]: (root) END EDIT (root)
Oct 3 10:57:01 oldboyedu crond[1365]: (root) RELOAD (/var/spool/cron/root)
Oct 4 11:01:24 oldboyedu CROND[2386]: (root) CMD (run-parts /etc/cron.hourly)
Oct 4 11:01:24 oldboyedu run-parts(/etc/cron.hourly)[2386]: starting 0anacron
Oct 4 11:01:24 oldboyedu anacron[2398]: Anacron started on 2019-10-04
Oct 4 11:01:24 oldboyedu run-parts(/etc/cron.hourly)[2400]: finished 0anacron
Oct 4 11:01:24 oldboyedu anacron[2398]: Will run job `cron.daily' in 37 min.
Oct 4 11:01:24 oldboyedu anacron[2398]: Jobs will be executed sequentially
Oct 4 11:00:44 oldboyedu CROND[2492]: (root) CMD (sh /server/scripts/ntpdate_sync.sh)
Oct 4 11:00:44 oldboyedu CROND[2494]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Oct 3 11:00:01 oldboyedu CROND[2520]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Oct 3 11:00:01 oldboyedu CROND[2523]: (root) CMD (sh /server/scripts/ntpdate_sync.sh)
13.4.1.2.9 查看是否执行成功
[root@oldboyedu ~] # date
Fri Oct 4 11:00:42 CST 2019
[root@oldboyedu ~] # date 发现时间已经修改为正确的时间
Thu Oct 3 10:59:55 CST 2019
[root@oldboyedu ~] # ll /tmp/oldboy.txt
-rw-r--r-- 1 root root 60 Oct 3 11:00 /tmp/oldboy.txt
[root@oldboyedu ~] # cat /tmp/oldboy.txt 环境变量也同步成功
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@oldboyedu ~] #
13.4.2 规范化的编写定时任务(将输出信息放入黑洞)
13.4.2.1 定时任务执行错误与正确的结果显示在哪里
13.4.2.1.1 postfix服务关闭的时候(inode会占用更多的)
[root@oldboyedu maildrop] # cd /var/spool/postfix/maildrop/ 定时任务会存在这个文件里面
[root@oldboyedu maildrop] # ll
total 8
-rwxr--r-- 1 root postdrop 608 Oct 3 11:19 1C423B3260
-rwxr--r-- 1 root postdrop 608 Oct 3 11:18 CA426B2D3C
13.4.2.1.2 postfix服务开启的时候(block会占用更多的)
[root@oldboyedu maildrop] # cat /var/spool/mail/root 定时任务会存在这个文件里面
From user@localhost.localdomain Mon Sep 23 22:43:29 2019
Return-Path: user@localhost.localdomain
最合理的做法
13.4.2.1.3 使用黑洞来保存输出内容的信息
[root@oldboyedu ~] # crontab -e
*/5 * * * * sh /server/scripts/ntpdate_sync.sh & > /dev/null 将内容输出到黑洞中
13.4.3 编写任务时候的特殊符号(特殊符号无法识别使用\来进行转义)
13.4.3.1 错误示范
13.4.3.1.1 编写定时任务
[root@oldboyedu ~] # crontab -e
* * * * * tar zcvf /opt/hosts_$(date +%F).tar.gz /etc/hosts 编写打包定时任务
13.4.3.1.2 查看日志
[root@oldboyedu maildrop] # tail -f /var/log//cron
查看定时任务日志,发现命令打包出错,不识别+号后面的字符
Oct 3 11:26:40 oldboyedu crontab[3053]: (root) REPLACE (root)
Oct 3 11:26:40 oldboyedu crontab[3053]: (root) END EDIT (root)
Oct 3 11:27:01 oldboyedu crond[1365]: (root) RELOAD (/var/spool/cron/root)
Oct 3 11:27:01 oldboyedu CROND[3122]: (root) CMD (tar zcvf /opt/hosts_$(date +)
13.4.3.2 正确示范
13.4.3.2.1 使用转义符号进行编写
[root@oldboyedu ~] # crontab -e
#30 */1 * * * cp /etc/hosts /etc/hosts_lyx.bak
#*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com
#*/5 * * * * sh /server/scripts/ntpdate_sync.sh & > /dev/null
* * * * * tar zcvf /opt/hosts_$(date +\%F).tar.gz /etc/hosts 添加转义符号
13.4.3.2.2 查看日志
[root@oldboyedu maildrop] # tail -f /var/log//cron 日志已经备份成功
Oct 3 11:32:09 oldboyedu crontab[3189]: (root) REPLACE (root)
Oct 3 11:32:09 oldboyedu crontab[3189]: (root) END EDIT (root)
Oct 3 11:33:01 oldboyedu crond[1365]: (root) RELOAD (/var/spool/cron/root)
Oct 3 11:33:01 oldboyedu CROND[3201]: (root) CMD (tar zcvf /opt/hosts_$(date +%F).tar.gz /etc/hosts)
13.4.3.2.3 查看备份是否真的成功
[root@oldboyedu ~] # ll /opt/
total 4
drwxr-xr-x. 2 root root 6 Sep 6 16:53 1.txt
-rw-r--r--. 1 root root 0 Sep 7 10:33 aa.txt
-rw-r--r-- 1 root root 170 Oct 3 11:33 hosts_2019-10-03.tar.gz 备份成功
drwxr-xr-x 2 root root 6 Oct 31 2018 rh
[root@oldboyedu ~] #
13.4.3.2.4 .使用脚本进行编写
[root@oldboyedu ~] # cat /server/scripts/tar_sync.sh
#!/bin/bash
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
tar zcvf /opt/hosts_$(date +\%F).tar.gz /etc/hosts
[root@oldboyedu ~] #
13.4.3.2.5 编写定时任务
[root@oldboyedu ~] # crontab -e 定时任务编写
* * * * * sh /server/scripts/tar_sync.sh & >/dev/null
13.4.3.2.6 查看日志
Oct 3 11:40:27 oldboyedu crontab[3410]: (root) REPLACE (root)
Oct 3 11:40:27 oldboyedu crontab[3410]: (root) END EDIT (root)
Oct 3 11:41:01 oldboyedu crond[1365]: (root) RELOAD (/var/spool/cron/root)
Oct 3 11:41:01 oldboyedu CROND[3444]: (root) CMD (sh /server/scripts/tar_sync.sh & >/dev/null)
日志中查看脚本执行成功
13.4.3.2.7 查看真实是否打包成功
[root@oldboyedu maildrop] # ll /opt/
total 4
drwxr-xr-x. 2 root root 6 Sep 6 16:53 1.txt
-rw-r--r--. 1 root root 0 Sep 7 10:33 aa.txt
-rw-r--r-- 1 root root 170 Oct 3 11:41 hosts_2019-10-03.tar.gz 已经打包成功
drwxr-xr-x 2 root root 6 Oct 31 2018 rh
[root@oldboyedu maildrop] #
13.4.4 定时任务编写的注意事项
- (1). 编写定时任务需要有注释信息 (时间 编写人员 任务作用)
- (2). 编写定时任务注意环境变量 /usr/bin:/bin 命令书写为绝对路径
- (3). 编写定时任务注意特殊符号 需要标记转义符号 \
- (4). 编写定时任务需要将输出信息定义到空 &>/dev/null
- (5). 编写定时任务建议使用脚本编写
13.4.5 编写定时任务错误表示方法(定时任务编写方式错误)
13.4.5.1 错误书写方式
4/2 * * * * cp /etc/hosts /etc/hosts_$(date +\%F-\%T) 4/2这种写法是无法保存成功的,格式书写错误
"/tmp/crontab.JQwB8M" 14L, 352C written
crontab: installing new crontab
"/tmp/crontab.JQwB8M":13: bad minute
errors in crontab file, can't install.
Do you want to retry the same edit?
13.4.5.2 编写定时任务正确的表示方法
4-59/2 * * * * cp /etc/hosts /etc/hosts_$(date +\%F-\%T)
13.5 定时任务编写时候的规范
13.5.1 命令编写定时任务时候的注意事项
- 测试命令是否可以在命令行执行
- 放入定时任务中(绝对路径)
- 调整时间信息进行测试
- 检查日志信息/检查任务执行结果
13.5.2 脚本编写定时任务时候的注意事项
- 编写脚本信息
- 测试脚本执行效果(/bin/sh /server/scripts/ntpdate_sync.sh)
- 放入定时任务中(绝对路径)
- 调整时间信息进行测试
- 检查日志信息/检查任务执行结果