定时任务
1.crond
crond是定期执行程序的命令,也是定时任务的守护进程
2.定时任务的作用
1.系统级别的定时任务:
1.1 临时文件清理
1.2 系统信息采集
1.3 日志文件切割
2.用户级别的定时任务:
2.1 定时向互联网同步时间
2.2 定时备份系统配置文件
2.3 定时备份数据库的数据
3.定时任务的语法
0 ✓ 14:35:31 root@ji,10.0.0.176:~ # 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:星期(0和7为星期天)
# | | | | |
# * * * * * user-name command to be executed
## 注:定时任务最小单位为分钟,无法精确到秒级
例:
# 每分钟都执行一次ls命令
* * * * * ls
# 每天的凌晨两点10分执行一次ls命令
10 02 * * * ls
# 每年的1,2,3月的1到14号并且是星期天的凌晨两点执行一次ls命令
00 02 1-14 1,2,3 7 ls
# 每过5分钟执行一次ls命令
*/5 * * * * ls
# 每天的1到7点和23点到24点执行一次ls命令
00 23-7 * * * ls
4.定时任务相关命令
crontab
选项:
-l(list):列出当前定时任务的设置
-e(edit):编辑定时任务,也就是编辑 /var/spool/cron/root文件
-r(remove):删除全部的定时任务
-u(user):指定定时任务的用户
5.定时任务的调试规则
1.crond调试
1.1 调整任务每分钟执行的频率,便于做后续调试
1.2 如果使用cron来运行脚本,将脚本执行的结果写入指定日志文件,观察日志内容是否正常
1.3 命令使用绝对路径,防止无法找到命令导致定时任务执行错误
1.4 通过查看/var/log/cron日志,检查执行的结果,方便进行调试
2.crond编写思路
2.1 手动执行命令,保留执行成功的结果
2.2 编写脚本
1.脚本最好统一存放到同一目录下
2.脚本内容复制执行成功的命令,减少每个环节出错几率
3.脚本内容尽可能的优化,使用一些变量和判断语句
4.脚本的输出信息可以重定向到其他文件中或重定向到/dev/null中
2.3 执行脚本
1.使用bash命令执行,防止脚本没有增加执行权限(x)
2.执行脚本成功后,复制该执行的命令,减少错误
2.4 编写定时任务
1.加上必要的注释信息,如人,时间,任务等
2.设定定时任务的执行周期
3.粘贴执行脚本的命令
2.5 调试定时任务
1.增加任务频率测试
2.检查环境变量问题
3.检查crond服务日志
6.备份定时任务的内容
为了防止使用crontab -r误删掉所有的定时任务,所以最好备份定时任务的内容:
cp /var/spool/cron/用户名 目标路径
7.拒绝指定用户使用定时任务
直接编写/etc/cron.deny,在里面添加指定的用户,则该用户无法使用定时任务
定时任务实战
1.时间同步定时任务
1.下载时间同步命令:
yum install -y ntpdate
2.测试该命令是否可以执行成功:
2 ✗ 15:22:44 root@ji,10.0.0.176:~ # ntpdate time1.aliyun.com
11 May 15:41:55 ntpdate[37869]: adjust time server 203.107.6.88 offset 0.000913 sec
3.编辑定时任务:
crontab -e
4.写入规则并将输出内容扔进黑洞:
*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com &>/dev/null
5.加上规范注释:
# Usage : Sync Date By:jl Date:2022/5/10
*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com &>/dev/null
6.动态查看定时任务日志:
tail -f /var/log/cron
# 最开始制作定时任务时最好每分钟执行一次,方便查找错误
2.每天的凌晨三点做一次备份
需求:
1.备份的文件名格式为:当前年月日_当前的主机名_etc.tar.gz
2.存放备份内容的目录只保留三天的数据
3.在执行计划任务时,不输出任务信息
1.将备份的文件用tar命令压缩
tar -zcPf /tmp/`date +%F`_`hostname`_etc.tar.gz /etc
2.编写脚本
# bin/bash
vim /tmp/data_backup.sh
# 创建存放备份文件的目录,如果存在则不创建
mkdir -p /tmp/bak_date
# 为该目录设置变量,以便以后修改
Backup_catalog="/tmp/bak_date"
tar -zcPf $Backup_catalog/`date +%F`_`hostname`_etc.tar.gz /etc
3.在备份目录中只保存三天的数据
find $Backup_catalog -type f ! -mtime -3 |xargs rm -f
4.将第三步的内容写入脚本中
# bin/bash
mkdir -p /tmp/bak_date
Backup_catalog="/tmp/bak_date"
tar -zcPf $Backup_catalog/`date +%F`_`hostname`_etc.tar.gz /etc
find $Backup_catalog -type f ! -mtime -3 |xargs rm -f
5.测试脚本是否执行成功:
sh data_backup.sh
![]()
6.编写定时任务:
crontab -e
7.将脚本写入进去并将输出的内容输入到黑洞中
* * * * * /usr/bin/sh data_backup.sh &>/dev/null
8.查看日志是否有错误
tail -f /var/log/cron
9.修改定时任务的指定时间并添加注释
# Usage: Backup By:jl Date:2022/5/11
00 03 * * * /usr/bin/sh data_backup.sh &>/dev/null
3.Linux发送邮件
1.安装邮件工具mailx:
yum install -y mailx
2.配置发件人:
vim /etc/mail.rc
在最后一行加入:
## 发件人
set from=你的qq邮箱
## QQ邮箱使用的邮件协议
set smtp=smtps://smtp.qq.com:465
## 发件人账号
set smtp-auth-user=你的qq邮箱
## 发件人密码
set smtp-auth-password=#客户端授权码
## 认证登录
set smtp-auth=login
## 忽略证书
set ssl-verify=ignore
## 证书存放目录
set nss-config-dir=/etc/pki/nssd
set from=# 你的QQ邮箱
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=# 你的QQ邮箱登录账号
set smtp-auth-password=# 客户端授权码
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
3.配置邮箱获取客户端授权码
3.1 打开浏览器搜索qq邮箱
![]()
3.2 登录qq邮箱后,点击设置
![]()
3.3 再点击账户
![]()
3.4 往下翻找到POP3和IMAP服务并开启
![]()
3.5 开启后获取客户端授权码
![]()
4.测试是否可以发送邮箱:
echo 'text' |mail -s '标题' 目标邮箱
![]()
4.使用定时任务发送邮件
1.创建一个目录存放要发送的文件:
mkdir /tmp/test
2.创建要发送的文件并编写:
touch {1..9}.txt
vim ... .txt
3.编写完成后编写脚本:
vim /tmp/test.sh
# /bin/bash
# 为测试目录设置变量
test_dir="/tmp/test"
# 将文件设置成变量
test_file=`ls -1 $test_dir/|head -1`
# 查看目录下是否有文件存在
count=`ls -1 $test_dir/ |wc -l`
# 判断目录下有文件,则将文件里的内容发送到指定的邮箱中,并把该文件移动到/opt下
if [ $count -gt 0 ];then
cat $test_dir/$test_file |mail -s '测试' 您的邮箱
mv $test_dir/$test_file /opt
fi
4.测试脚本是否发送成功:
sh /tmp/test.sh
![]()
5.编写定时任务:
[root@localhost tmp]# crontba -e
# Usage: test_mail By:jl Date:2022/05/11
* * * * * /bin/sh test.sh &> /dev/nul
6.查看日志(或查看邮箱是否接收到信息):
tail -f /var/log/cron