定时任务-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邮箱客户端授权码方法

1,打开QQ邮箱 点设置 选择账户

img

img

2,开启POP3/SMTP服务 或者 IMAP/SMTP服务 开启后生成授权码 选择一个复制到配置中

img

使用定时任务发情书

## 创建情书存放目录
[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