文章目录
展开定时任务-crond
什么是crond
crond是一个服务 是定时任务的守护进程
定时任务的作用
1.系统级别的定时任务
临时文件清理
系统信息采集
日志文件切割
2.用户级别的定时任务
定时向互联网同步时间
定时备份系统配置文件
定时备份数据库的数据
定时任务语法
### 定时任务的配置文件↓
[root@wudidesangege ~]\ vim /etc/crontab
## 定时任务,支持bash命令
SHELL=/bin/bash
## 定时任务只支持写在以下目录内的命令↓(建议:写在定时任务中的命令全部使用绝对路径)
PATH=/sbin:/bin:/usr/sbin:/usr/bin
## 定时任务执行的内容,如果有输出,或者有报错,则通过邮件发给root用户
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
### 定时任务语法↓
* * * * * [用户] 命令 # 不指定用户就默认为当前用户
# 建议:写定时任务时 先写上 * * * * * 然后再慢慢改
## 五星各代表的含义↓ (周日可以用 0 或者 7 表示)
* * * * *
分 时 日 月 周
# 注意:定时任务最小单位分钟,无法精确到秒级
定时任务相关命令
## 定时任务指令↓
crontab
## 选项
-l:list 列出当前定时任务的列表
-e:edit 编辑定时任务 vim /var/spool/cron/root
-r:remove 删除定时任务(删除全部定时任务)
-u:user 指定定时任务的用户
## 练习题↓
00 02 * * * ls # 每天的凌晨2点执行一次ls
00 02 1 * * ls # 每月的1号的凌晨2点执行一次ls
00 02 14 2 * ls # 每年的2月14号的凌晨2点执行一次ls
00 02 * * 7 ls # 每个星期天的凌晨2点执行一次ls
00 02 * 6 5 ls # 每年6月份里的每个星期五的凌晨2点执行一次ls
00 02 14 * 7 ls # 每个月里的14号 恰好这天还是星期天的凌晨2点执行一次ls
00 02 14 2 7 ls # 每年2月份的14号 恰好这天还是星期天的凌晨2点执行一次ls
*/10 02 * * * ls # 每天的凌晨2点 每隔10分钟执行一次ls
* * * * * ls # 每分钟执行一次ls
00 00 14 2 * ls # 每年的2月14号0点执行一次ls
*/5 * * * * ls # 每隔五分钟执行一次ls
00 02 * 1,5,8 * ls # 每年的1月,5月,8月 这三个月的每天凌晨2点执行一次ls
00 02 1-8 * * ls # 每个月的1号到8号 这八天的凌晨2点执行一次ls
0 21 * * * ls # 每天的21点执行一次ls
45 4 1,10,22 * * ls # 每个月的1号,10号,22号 这三天的凌晨4点45分执行一次ls
45 4 1-10 * * ls # 每个月的1到10号 这10天的 凌晨4点45分执行一次ls
3,15 8-11 */2 * * ls # 每隔两天的8点到11点 这4小时的每个3分钟 和 每个15分钟时 执行一次ls
0 23-7/1 * * * ls # 每天的 1点到7点 23点到0(24)点 这两个时间段的每小时执行一次ls
15 21 * * 1-5 ls # 每个星期的星期一到星期五 这五天每天的21点15分执行一次ls
定时任务调试规则
1,crond调试
- 1:调整任务每分钟执行的频率 以便做后续的调试
- 2:如果使用cron运行脚本 请将脚本执行的结果写入指定日志文件 以便观察日志内容是否正常
- 3:命令使用绝对路径 防止无法找到命令导致定时任务执行产生故障
- 4:通过查看/var/log/cron日志 以便检查我们执行的结果 方便进行调试
2,crond编写思路
- 1.手动执行命令,然后保留执行成功的结果。
- 2.编写脚本
- 脚本需要统一路径/scripts
- 脚本内容复制执行成功的命令(减少每个环节出错几率)
- 脚本内容尽可能的优化, 使用一些变量或使用简单的判断语句
- 脚本执行的输出信息可以重定向至其他位置保留或写入/dev/null
- 3.执行脚本
- 使用bash命令执行, 防止脚本没有增加执行权限(/usr/bin/bash)
- 执行脚本成功后,复制该执行的命令,以便写入cron
- 4.编写计划任务
- 加上必要的注释信息, 人、时间、任务
- 设定计划任务执行的周期
- 粘贴执行脚本的命令(不要手敲)
- 5.调试计划任务
- 增加任务频率测试
- 检查环境变量问题
- 检查crond服务日志
定时任务实战
实战案例一:时间同步
# 任务需求:每5分钟时间同步一次↓
# 1,需要下载时间同步命令
[root@web ~]# yum install -y ntpdate
# 2,要先测试命令是否可以在命令行执行成功
[root@web ~]# ntpdate time1.aliyun.com
26 Jul 21:18:03 ntpdate[1310]: step time server 203.107.6.88 offset -28798.193468
# 3,编辑定时任务
[root@web ~]# crontab -e
# 4,写入规则 (建议:先测试执行要写入的命令 测试成功后直接复制刚才执行成功的命令)
* * * * * ntpdate time1.aliyun.com
# 5,写入内容里的命令写该命令的绝对路径 先查找该命令的绝对路径 然后复制
[root@web ~]# which ntpdate
/usr/sbin/ntpdate
# 6,完善规则中的命令路径
* * * * * /usr/sbin/ntpdate time1.aliyun.com
# 7,查看定时任务日志 等一分钟看看定时任务是否执行 是否有报错
[root@web ~]# tail -f /var/log/cron # ←定时任务日志
# 8,正常执行后根据规定的时间来进行定时任务编写
*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com
# 9,查看命令是否有输出内容,如果有则扔进黑洞
*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com &>/dev/null
# 10,每个定时任务前加上规范注释
# Usage: Sync Date By:zls Date:2022/05/10
*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com &>/dev/null
实战案例二:文件备份
### 任务需求:每天凌晨3点做一次备份
并将备份命令写入一个脚本中
脚本需求↓
1.每天备份文件名要求格式:2018-02-20_hostname_etc.tar.gz
2.存放备份内容的目录要求只保留3天的数据
3.在执行计划任务时,不要输出任务信息
## 1,备份的tar文件包名加日期加主机名的方法
[root@web ~]# date +%F # 查看日期
2022-05-11
[root@web ~]# hostname # 查看主机名
wudidesangege.wszdwd
1, cd / && tar zcf `date +%F`_`hostname`_etc.tar.gz etc # 使用 `` 或者 $() 的方式
2, cd / && tar zcf $(date +%F)_$(hostname)_etc.tar.gz etc # 让`` 或者 $() 里的内容执行
## 2,存放备份内容的目录只保留3天的数据
find /存放备份的目录 -type f ! -mtime -3|xargs rm -f
## 3,创建一个脚本文件 .sh 结尾 将命令写入脚本中
## 建议:脚本中每添加一行内容前先测试执行一次命令 然后复制进脚本
[root@web ~]# vim backup_etc.sh
#!/bin/bash
cd / && tar zcf /backup/$(date +%F)_$(hostname)_etc.tar.gz etc
find /bak -type f ! -mtime -3|xargs rm -f
## 4,先手动执行一次脚本,在命令行中 执行成功后 编写定时任务
[root@web ~]# which sh # 让脚本执行的方法 sh指令 bash指令 或者给脚本文件执行权限
/bin/sh
[root@web ~]# /bin/sh /root/backup_etc.sh
[root@web ~]# crontab -e
* * * * * /bin/sh /root/backup_etc.sh # 定时任务内的指令加绝对路径
## 5,查看定时任务日志 等一分钟看看定时任务是否执行 是否有报错
[root@web ~]# tail -f /var/log/cron # ←定时任务日志
## 6,执行成功后 将定时任务修改为需求内的时间 并且不输出内容
[root@web ~]# crontab -e
00 03 * * * /bin/sh /root/backup_etc.sh &>/dev/null
## 7,加注释
[root@web ~]# crontab -e
# Usage: Backup etc By:zls Date:2022/05/11
00 03 * * * /bin/sh /root/backup_etc.sh &>/dev/null
### 优化脚本内容
#!/bin/bash
bak_dir="/bak"
mkdir -p $bak_dir # 创建目录存放这个定时任务的文件
cd / && tar zcf $bak_dir/$(date +%F)_$(hostname)_etc.tar.gz etc
find $bak_dir -type f ! -mtime -3|xargs rm -f
Linux发邮件
## 1,安装发邮件工具mailx
[root@web ~]# yum install -y mailx
## 2,配置发件人
[root@web ~]# vim /etc/mail.rc
# 在这个配置文件的末尾加上以下内容↓
set from=你的QQ邮箱@qq.com # 发件人
set smtp=smtps://smtp.qq.com:465 # QQ邮箱使用的邮件协议
set smtp-auth-user=你的QQ邮箱登录账号@qq.com # 发件人账号
set smtp-auth-password=客户端授权码 # 发件人密码
set smtp-auth=login # 认证登录
set ssl-verify=ignore # 忽略证书
set nss-config-dir=/etc/pki/nssdb/ # 证书存放目录
## 3,完成文件配置后 就可以发用你设置的邮箱发邮件给别的邮箱了
[root@web ~]# ehco '需要写入的内容' |mail -s '邮件标题' 想要发送的邮箱地址
获取QQ邮箱客户端授权码方法
# 任务需求:每5分钟时间同步一次↓
# 1,需要下载时间同步命令
[root@web ~]# yum install -y ntpdate
# 2,要先测试命令是否可以在命令行执行成功
[root@web ~]# ntpdate time1.aliyun.com
26 Jul 21:18:03 ntpdate[1310]: step time server 203.107.6.88 offset -28798.193468
# 3,编辑定时任务
[root@web ~]# crontab -e
# 4,写入规则 (建议:先测试执行要写入的命令 测试成功后直接复制刚才执行成功的命令)
* * * * * ntpdate time1.aliyun.com
# 5,写入内容里的命令写该命令的绝对路径 先查找该命令的绝对路径 然后复制
[root@web ~]# which ntpdate
/usr/sbin/ntpdate
# 6,完善规则中的命令路径
* * * * * /usr/sbin/ntpdate time1.aliyun.com
# 7,查看定时任务日志 等一分钟看看定时任务是否执行 是否有报错
[root@web ~]# tail -f /var/log/cron # ←定时任务日志
# 8,正常执行后根据规定的时间来进行定时任务编写
*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com
# 9,查看命令是否有输出内容,如果有则扔进黑洞
*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com &>/dev/null
# 10,每个定时任务前加上规范注释
# Usage: Sync Date By:zls Date:2022/05/10
*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com &>/dev/null
### 任务需求:每天凌晨3点做一次备份
并将备份命令写入一个脚本中
脚本需求↓
1.每天备份文件名要求格式:2018-02-20_hostname_etc.tar.gz
2.存放备份内容的目录要求只保留3天的数据
3.在执行计划任务时,不要输出任务信息
## 1,备份的tar文件包名加日期加主机名的方法
[root@web ~]# date +%F # 查看日期
2022-05-11
[root@web ~]# hostname # 查看主机名
wudidesangege.wszdwd
1, cd / && tar zcf `date +%F`_`hostname`_etc.tar.gz etc # 使用 `` 或者 $() 的方式
2, cd / && tar zcf $(date +%F)_$(hostname)_etc.tar.gz etc # 让`` 或者 $() 里的内容执行
## 2,存放备份内容的目录只保留3天的数据
find /存放备份的目录 -type f ! -mtime -3|xargs rm -f
## 3,创建一个脚本文件 .sh 结尾 将命令写入脚本中
## 建议:脚本中每添加一行内容前先测试执行一次命令 然后复制进脚本
[root@web ~]# vim backup_etc.sh
#!/bin/bash
cd / && tar zcf /backup/$(date +%F)_$(hostname)_etc.tar.gz etc
find /bak -type f ! -mtime -3|xargs rm -f
## 4,先手动执行一次脚本,在命令行中 执行成功后 编写定时任务
[root@web ~]# which sh # 让脚本执行的方法 sh指令 bash指令 或者给脚本文件执行权限
/bin/sh
[root@web ~]# /bin/sh /root/backup_etc.sh
[root@web ~]# crontab -e
* * * * * /bin/sh /root/backup_etc.sh # 定时任务内的指令加绝对路径
## 5,查看定时任务日志 等一分钟看看定时任务是否执行 是否有报错
[root@web ~]# tail -f /var/log/cron # ←定时任务日志
## 6,执行成功后 将定时任务修改为需求内的时间 并且不输出内容
[root@web ~]# crontab -e
00 03 * * * /bin/sh /root/backup_etc.sh &>/dev/null
## 7,加注释
[root@web ~]# crontab -e
# Usage: Backup etc By:zls Date:2022/05/11
00 03 * * * /bin/sh /root/backup_etc.sh &>/dev/null
### 优化脚本内容
#!/bin/bash
bak_dir="/bak"
mkdir -p $bak_dir # 创建目录存放这个定时任务的文件
cd / && tar zcf $bak_dir/$(date +%F)_$(hostname)_etc.tar.gz etc
find $bak_dir -type f ! -mtime -3|xargs rm -f
## 1,安装发邮件工具mailx
[root@web ~]# yum install -y mailx
## 2,配置发件人
[root@web ~]# vim /etc/mail.rc
# 在这个配置文件的末尾加上以下内容↓
set from=你的QQ邮箱@qq.com # 发件人
set smtp=smtps://smtp.qq.com:465 # QQ邮箱使用的邮件协议
set smtp-auth-user=你的QQ邮箱登录账号@qq.com # 发件人账号
set smtp-auth-password=客户端授权码 # 发件人密码
set smtp-auth=login # 认证登录
set ssl-verify=ignore # 忽略证书
set nss-config-dir=/etc/pki/nssdb/ # 证书存放目录
## 3,完成文件配置后 就可以发用你设置的邮箱发邮件给别的邮箱了
[root@web ~]# ehco '需要写入的内容' |mail -s '邮件标题' 想要发送的邮箱地址
1,打开QQ邮箱 点设置 选择账户
2,开启POP3/SMTP服务 或者 IMAP/SMTP服务 开启后生成授权码 选择一个复制到配置中
使用定时任务发情书
## 创建情书存放目录
[root@web ~]# mkdir /love
## 编写情书
[root@web ~]# vim /love/1.txt
[root@web ~]# vim /love/2.txt
[root@web ~]# vim /love/3.txt
[root@web ~]# vim /love/4.txt
[root@web ~]# vim /love/5.txt
## 编写一封封发送情书的脚本
[root@web ~]# cat /love/1.txt |mail -s '情书' 1637991558@qq.com
[root@web ~]# vim send_love.sh
#!/bin/bash
love_dir="/love"
love_name=`ls -1 $love_dir/|head -1` # ls -1:竖直查看文件 head -1:查找出第一个文件
cat $love_dir/$love_name |mail -s '情书' 1637991558@qq.com
rm -f $love_dir/$love_name
## 编写定时任务
1,测试脚本发送
[root@web ~]# /bin/sh /root/send_love.sh
2,编辑定时任务
# Usage: Send Love By: hg Date: 2022/07/19
* * * * * /bin/sh /root/send_love.sh &>/dev/null
3,查看日志
[root@web ~]# tail -f /var/log/cron
### 当你的情书发完以后 还会一直发空文件给小姐姐 这样显然是不行的 停止方法↓
[root@web ~]# vim send_love.sh
#!/bin/bash
love_dir="/love"
love_name=`ls -1 $love_dir/|head -1`
count=`ls -1 /love/|wc -l`
if [ $count -gt 0 ];then
cat $love_dir/$love_name |mail -s '情书' 1637991558@qq.com
mv $love_dir/$love_name /tmp
fi
备份存放定时任务的文件
## 存放定时任务的文件位置↓
/var/spool/cron/用户名
## 备份存放定时任务的文件的方法↓ (就是备份/var/spool/cron/用户名)
[root@web ~]# mkdir /bak/root_cron
[root@web ~]# cp /var/spool/cron/root /bak/root_cron
拒绝某个用户使用定时任务
## 只要将用户名写入 /etc/cron.deny文件中 那么该用户就无法使用定时任务
[root@web ~]# vim /etc/cron.deny
hmbb
pdx
Comments | NOTHING