定时任务-crond

定时任务-crond

什么是crond

  • crond是一个服务,是定时任务的守护进程

定时任务的作用

  • 1.系统级别的定时任务

    • 临时文件清理
    • 系统信息采集
    • 日志文件切割
  • 2.用户级别的定时任务

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

定时任务语法

  • vim /etc/crontab

    [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
    
    ### 切记:定时任务最小单位分钟,无法精确到秒级
    
  • 语法

    • 写定时任务,上来就六亲不认先写 五颗星 * * * * *
    # * * * * * user-name command to be executed
    # 30 7 * * * 用户 ls
    # 分 时 日 月 周
    
    
    # 每天凌晨2点,执行一次ls命令,并不要输出任务信息
    00 02 * * * ls >/dev/null
    # 每个月的1号凌晨2点执行一次ls命令
    00 02 1 * * ls
    # 每年的2月14凌晨2点,执行一次ls命令
    00 02 14 2 * ls
    # 每周日,凌晨2点执行一次ls命令
    00 02 * * 7 ls
    # 每年6月份的每个周五凌晨2点执行一次ls命令
    00 02 * 6 5 ls
    # 每年的每个月的14号恰巧又是周日的时候
    00 02 14 * 7 ls
    # 每年的2月14号,恰巧又是周日凌晨两点才执行ls命令
    00 02 14 2 7 ls
    # 每天凌晨2点,每隔10分钟执行一次ls命令
    */10 02 * * * ls
    # 每分钟执行一次ls命令
    * * * * * ls
    # 每年的2月14日,00点执行一次ls
    00 00 14 2 * ls
    # 每隔5分钟执行一次ls命令
    */5 * * * * ls
    # 每年的1月和5月和8月的每天凌晨2点都执行一次ls命令
    00 02 * 1,5,8 * ls
    # 每个月的1号到8号凌晨2点执行一次ls命令
    00 02 1-8 * * ls
    # 每天晚上21点执行一次ls命令
    0 21 * * * ls
    # 每个月的1号 10号 和 22号的凌晨4点45分执行一次ls命令
    45 4 1,10,22 * * ls
    # 每个月的1号到10号4点45分执行一次ls命令
    45 4 1-10 * * ls
    # 每个月的每隔2天的8点到11点的03分和15分分别执行ls命令
    3,15 8-11 */2 * * ls
    # 每天的1点到7点和23点到24点的整点执行一次ls命令
    0 23-7/1 * * * ls
    # 每周的周一到周五21点15分执行一次ls命令
    15 21 * * 1-5 ls
    

定时任务相关命令-crontab

# 命令:
crontab

# 选项:
-l:list     # 列出当前定时任务的列表
-e:edit     # 编辑定时任务 vim /var/spool/cron/root
-r:remove   # 删除定时任务(删除全部定时任务)
-u:user     # 指定定时任务的用户

定时任务实战

# 1.时间同步定时任务

##(1)需要下载时间同步命令
[root@localhost~]# yum install -y ntpdate

##(2)要先测试命令是否可以在命令行执行成功
[root@localhost~]# ntpdate time1.aliyun.com
11 May 18:59:09 ntpdate[7846]: step time server 203.107.6.88 offset 1.545863 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:cgb Date:2022/05/11
*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com &>/dev/null

##(10)查看定时任务日志之前,最开始定时任务,每分钟执行一次,写完之后查看日志。
最开始定时任务,每分钟执行一次,写完之后查看日志。
# Usage: Sync Date By:cgb Date:2022/05/11
* * * * * /usr/sbin/ntpdate time1.aliyun.com &>/dev/null

## (11)查看定时任务日志
[root@localhost~]# tail -f /var/log/cron

企业实操案例:

  • 需求:每天凌晨3点做一次备份
    将备份命令写入一个脚本中

  • 任务:
    1.每天备份文件名要求格式:2018-02-20_hostname_etc.tar.gz
    2.存放备份内容的目录要求只保留3天的数据
    3.在执行计划任务时,不要输出任务信息

# 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: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

备份定时任务的内容

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

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

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

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

  • vim /etc/cron.deny

[root@localhost~]# vim /etc/cron.deny
lx15
oldboy
oldgirl

## 这时 lx15、oldboy、oldgirl 这三个用户没法使用定时任务

定时任务调试规则

  • 1.crond调试

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

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

Linux发邮件

  • 1.安装发邮件工具mailx
[root@localhost~]# yum install -y mailx
  • 2.配置发件人

    vim /etc/mail.rc

[root@localhost~]# vim /etc/mail.rc 

# 在尾行 输入:
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/



## 发件人
set from=783434343@qq.com
## QQ邮箱使用的邮件协议
set smtp=smtps://smtp.qq.com:465
## 发件人账号
set smtp-auth-user=783434343@qq.com
## 发件人密码
set smtp-auth-password=#客户端授权码
## 认证登录
set smtp-auth=login
## 忽略证书
set ssl-verify=ignore
## 证书存放目录
set nss-config-dir=/etc/pki/nssdb/

配置邮箱

  • 首先登录邮箱

  • 点击设置 -> 账户

  • 开启POP3 和IMAP 服务

    获取授权码

    来配置发件人密码:vim /etc/mail.rc

    set smtp-auth-password=#客户端授权码

  • linux发送邮件

    echo 'test' |mail -s '这里是标题' 邮箱
    
    [root@localhost~]# echo 'test' |mail -s 'LOVE' 785034343@qq.com
    

使用定时任务发情书

  • 创建情书存放目录

    [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~]# vim /love/7.txt
    
  • 编写发送情书的脚本

    # 测试是否能发送邮件
    [root@localhost~]# cat /love/1.txt |mail -s '情书' 785034343@qq.com
    
    #编辑定时任务执行脚本
    [root@localhost~]# vim send_love.sh
    #!/bin/bash
    love_dir="/love"
    love_name=`ls -1 $love_dir/|head -1`
    cat $love_dir/$love_name |mail -s '情书' 785034343@qq.com
    rm -f $love_dir/$love_name
    
  • 编写定时任务

    # 1)测试脚本发送
    [root@localhost~]# /bin/sh /root/send_love.sh
    
    # 2)编辑定时任务
    # Usage: Send Love By: zls Date: 2022/05/11
    * * * * * /bin/sh /root/send_love.sh &>/dev/null
    
    # 3)查看日志
    [root@localhost~]# tail -f /var/log/cron
    
    
    ## 优化脚本 使用判断
    [root@localhost~]# 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 '情书' 133411023@qq.com
    mv $love_dir/$love_name /tmp
    fi
    

思维导图

posted @   悠悠哉55  阅读(649)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示