定时任务

定时任务

1.定时任务crond命令

什么是crond

cron是一个linux下的定时执行工具(相当于windows下的scheduled task),可以在无需人工干预的情况下定时地运行任务task

我们经常使用的是crontab命令是cron table的简写,它是cron的配置文件,也可以叫它作业列表,我们可以在以下文件夹内找到相关配置文件。

  • /var/spool/cron/ 目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名
  • /etc/crontab 这个文件负责调度各种管理和维护任务。
  • /etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本。
  • 我们还可以把脚本放在/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly目录中,让它每小时/天/星期、月执行一次。

2.定时任务的作用

1.系统级别的定时任务

  • 临时文件清理
  • 系统信息采集
  • 日志文件切割

2.用户级别的定时任务

  • 定时向互联网同步时间
  • 定时备份系统配置文件
  • 定时备份数据库的数据

3.定时任务语法

[root@localhost ~]# 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

*  *  *  *  * 
分 时 日 月 周
#定时任务最小单位分钟,无法精确到秒

4.定时任务相关命令

# 常用命令如下
crontab [-u username] [-l|-e|-r]   //省略用户表表示操作当前用户
选项与参数:
-u  :root权限才能进行这个任务,缺省时默认为当前的用户
-e  :编辑用户的crontab文件,保存好后会自动提交
-l  :查阅当前用户的crontab的工作内容
-r  :移除当前用户所有的 crontab 的工作内容,若仅要移除一项,请去修改crontab文件

#crontab的时间编写实例
* 每
*/n 每隔n
, 分割
- 从什么到什么

00 02 * * * ls          #每天的凌晨2点整执行
00 02 1 * * ls          #每月的1日的凌晨2点整执行
00 02 14 2 * ls         #每年的2月14日凌晨2点执行
00 02 * * 7 ls          #每周天的凌晨2点整执行
00 02 * 6 5 ls          #每年的6月周五凌晨2点执行
00 02 14 * 7 ls         #每月14日或每周日的凌晨2点都执行
00 02 14 2 7 ls         #每年的2月14日或每年2月的周天的凌晨2点执行   
*/10  02 * * * ls       #每天凌晨2点,每隔10分钟执行一次
* * * * *  ls           #每分钟都执行
00 00 14 2 *  ls        #每年2月14日的凌晨执行命令 
*/5 * * * *  ls         #每隔5分钟执行一次
00 02 * 1,5,8 * ls      #每年的1月5月8月凌晨2点执行
00 02 1-8 * *  ls       #每月1号到8号凌晨2点执行
0 21 * * * ls           #每天晚上21:00执行
45 4 1,10,22 * * ls     #每月的1,10,22号的4:45执行
45 4 1-10 * * ls        #每月的1到10号的4:45执行
3,15 8-11 */2 * * ls    #每隔两天的上午8点到11点的第3和第15分钟执行
0 23-7/1 * * * ls       #晚上11点到早上7点之间,每隔一个小时执行
15 21 * * 1-5 ls        #周一到周五每天晚上21:15执行

5.定时任务调试规则

crond调试

  • 调整任务每分钟执行的频率, 以便做后续的调试。
  • 如果使用cron运行脚本,请将脚本执行的结果写入指定日志文件, 观察日志内容是否正常。
  • 命令使用绝对路径, 防止无法找到命令导致定时任务执行产生故障。
  • 通过查看/var/log/cron日志,以便检查我们执行的结果,方便进行调试。

crond编写思路

  • 手动执行命令,然后保留执行成功的结果。
  • 编写脚本
    • 脚本需要统一路径/scripts
    • 脚本内容复制执行成功的命令(减少每个环节出错几率)
    • 脚本内容尽可能的优化, 使用一些变量或使用简单的判断语句
    • 脚本执行的输出信息可以重定向至其他位置保留或写入/dev/null
  • 执行脚本
    • 使用bash命令执行, 防止脚本没有增加执行权限(/usr/bin/bash)可以使用which查看命令的绝对路径
    • 执行脚本成功后,复制该执行的命令,以便写入cron
  • 编写计划任务
    • 加上必要的注释信息, 人、时间、任务
    • 设定计划任务执行的周期
    • 粘贴执行脚本的命令(不要手敲)
    • 所有命令必须使用绝对路径(可以使用which进行查看)
  • 调试计划任务
    • 增加任务频率测试
    • 检查环境变量问题
    • 检查crond服务日志 /var/log/cron

拒绝某个用户使用定时任务

root@localhost ~]# vim /etc/cron.deny

## 只要将用户名写入 /etc/cron.deny文件中,则该用户无法使用定时任务

备份定时任务的内容

就是备份/var/spool/cron/用户名

[root@localhost ~]# cp /var/spool/cron/root /bak/root_cron

6.定时任务实战

1.需求:每天凌晨3点做一次备份

将备份命令写入一个脚本中

任务:

  1. 每天备份文件名要求格式:2018-02-20_hostname_etc.tar.gz

  2. 存放备份内容的目录要求只保留3天的数据

  3. 在执行计划任务时,不要输出任务信息

布置环境

# 时间同步定时任务
1)需要下载时间同步命令
[root@localhost ~]# yum install -y ntpdate
2)要先测试命令是否可以在命令行执行成功
[root@localhost ~]# ntpdate time1.aliyun.com
10 May 12:24:00 ntpdate[7639]: step time server 203.107.6.88 offset -28800.016971 sec
3)编辑定时任务
[root@localhost ~]# crontab -e
4)写入规则(命令复制刚才执行成功的命令)
* * * * * ntpdate time1.aliyun.com
5)查找该命令的绝对路径
[root@localhost ~]# which ntpdate
/usr/sbin/ntpdate
6)完善规则中的命令路径
* * * * * /usr/sbin/ntpdate time1.aliyun.com
7)根据规定的时间来进行定时任务编写
*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com
8)查看命令是否有输出内容,如果有则扔进黑洞
*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com &>/dev/null
9)加上规范注释
# Usage: Sync Date  By:lw Date:2022/05/10
*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com &>/dev/null
10)查看定时任务日志最开始定时任务,每分钟执行一次,写完之后查看日志。
[root@localhost ~]# tail -f /var/log/cron

实战:

# 1.备份使用tar命令
cd / && tar zcf 2018-02-20_hostname_etc.tar.gz etc
1)实现包名加日期需求:date +%F
cd / && tar zcf `date +%F`_hostname_etc.tar.gz etc
或
cd / && tar zcf $(date +%F)_hostname_etc.tar.gz etc
2)实现包名加主机名需求:hostname
cd / && tar zcf `date +%F`_`hostname`_etc.tar.gz etc
或
cd / && tar zcf $(date +%F)_$(hostname)_etc.tar.gz etc
3)将命令写入脚本中
[root@localhost ~]# vim backup_etc.sh
#!/bin/bash
cd / && tar zcf /backup/$(date +%F)_$(hostname)_etc.tar.gz etc
4)只保留3天的数据
find /backup -type f ! -mtime-3|xargs rm-f
5)不输出任务信息在定时任务中 &>/dev/null
6)编写定时任务
## 先手动执行一次脚本,在命令行中
root@localhost ~]# /bin/sh /root/backup_etc.sh
## 如果没有报错,再编写定时任务
[root@localhost ~]# crontab -e
## 定时任务,提高频率先每分钟执行一次
* * * * * /bin/sh /root/backup_etc.sh
7)优化定时任务内容
# 1.不需要输出内容
* * * * * /bin/sh /root/backup_etc.sh &>/dev/null
# 2.满足需求中的时间
00 03 * * * /bin/sh /root/backup_etc.sh &>/dev/null
# 3.加注释
# Usage: Backup etc By:lw 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

2.Linux定时发邮件

布置环境

# 1.安装发邮件工具mailx
[root@localhost ~]# yum install -y mailx
# 2.配置发件人
[root@localhost ~]# vim /etc/mail.rc
## 发件人
setfrom=1627556442@qq.com
## QQ邮箱使用的邮件协议
setsmtp=smtps://smtp.qq.com:465
## 发件人账号
setsmtp-auth-user=1627556442@qq.com
## 发件人密码
setsmtp-auth-password=#客户端授权码
## 认证登录
setsmtp-auth=login
## 忽略证书
setssl-verify=ignore
## 证书存放目录
setnss-config-dir=/etc/pki/nssdb/

setfrom=# 你的QQ邮箱
setsmtp=smtps://smtp.qq.com:465
setsmtp-auth-user=# 你的QQ邮箱登录账号
setsmtp-auth-password=# 客户端授权码
setsmtp-auth=login
setssl-verify=ignore
setnss-config-dir=/etc/pki/nssdb/

配置邮箱

打开邮箱>>设置>>账户

开启POP3IMAP服务

生成授权码

将客户端授权码写入上述vim /etc/mail.rc文件中

实战

## 创建情书存放目录
[root@localhost ~]# mkdir /love
## 编写情书
[root@localhost ~]# vim /love/1.txt
[root@localhost ~]# vim /love/2.txt
[root@localhost ~]# vim /love/3.txt
[root@localhost ~]# vim /love/4.txt
[root@localhost ~]# vim /love/5.txt
[root@localhost ~]# vim /love/6.txt
## 编写发送情书的脚本
[root@localhost ~]# cat /love/1.txt |mail -s '情书' 1627556442@qq.com
[root@localhost ~]# vim send_love.
!/bin/bash
love_dir="/love"
love_name=`ls -1 $love_dir/|head -1`

cat $love_dir/$love_name |mail -s'情书'133411023@qq.com
rm -f $love_dir/$love_name

## 编写定时任务
1)测试脚本发送
[root@localhost ~]# /bin/sh /root/send_love.sh
2)编辑定时任务
# Usage: Send Love By: lw Date: 2022/05/11
* * * * * /bin/sh /root/send_love.sh &>/dev/null
3)查看日志
[root@localhost ~]# tail -f /var/log/cron

#/love目录里的文件如果发完会自动发送空出去可增加一个判断语句结束
!/bin/bash
love_dir="/love"
love_name=`ls -1 $love_dir/|head -1`
count=`ls -1 /love/|wc -l`

if [ $count-gt0 ];then
  cat $love_dir/$love_name |mail -s'情书'1627556442@qq.com
  mv$love_dir/$love_name /tmp
fi
posted @ 2022-05-11 19:02  Gie  阅读(265)  评论(0编辑  收藏  举报