zoukankan      html  css  js  c++  java
  • 第二十七章 Linux系统管理之定时任务

    一、定时任务概述

    1.含义:设定某个日期或时间周期性执行指令。

    2.crond       # 守护进程 分钟级别

      rond是Linux系统中用来定期执行命令或脚本的一种服务软件,一般情况下,我们安装完CentOS操作系统之后,

    默认便会启动Crond任务调度服务。

         Crond服务会定期(默认每分钟检查一次)检查系统中是否有要执行的任务工作,如果有,便会根据其预先设定的定

    时任务规则自动执行该定时任务工作,这个Crond定时任务服务就相当于我们平时早起使用的闹钟一样。

    3.使用情况:

    两种:

    系统级别定时任务: 定时清理文件 收集系统信息 定时切割日志

    用户级别定时任务: 同步时间 定时备份数据

    二、定时任务相关介绍

    [root@jindada ~]# ll /etc/cron* -d
    drwxr-xr-x. 2 root root 21 Jul 29 08:56 /etc/cron.d        #定时任务的统一存放目录
    drwxr-xr-x. 2 root root 57 Jul 29 08:56 /etc/cron.daily     #系统每天执行的定时任务
    -rw------- 1 root root 0 Apr 11 2018 /etc/cron.deny          #定时任务的黑名单
    drwxr-xr-x. 2 root root 22 Jul 29 08:56 /etc/cron.hourly        #系统每小时执行的定时任务
    drwxr-xr-x. 2 root root 6 Jun 10 2014 /etc/cron.monthly       #系统每月执行的定时任务
    -rw-r--r-- 1 root root 451 Jun 10 2014 /etc/crontab           #定时任务主配置文件
    drwxr-xr-x. 2 root root 6 Jun 10 2014 /etc/cron.weekly         #系统每周执行的定时任务

     

    [root@jindada ~]# cat /etc/crontab
    SHELL=/bin/bash             #定时任务所使用的命令解释器
    PATH=/sbin:/bin:/usr/sbin:/usr/bin   #定时任务所能用到的命令路径
    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

    分时日月周 用户 命令


    #跟定时任务相关的文件

    [root@jindada ~]# ll /var/spool/cron/root    #存放定时任务的配置文件
    total 0

    [root@jindada ~]# ll /var/log/cron        #定时任务执行的过程 日志


    [root@jindada ~]# ll /var/spool/mail/     #用户的邮件


    怎样书写定时任务

    crontab      #书写定时任务的命令

    选项:

    -e #编辑定时任务 === vi /var/spool/cron/root

    -l #查看定时任务 === cat /var/spool/cron/root

    1. 语法检查

    2. 方便简单


    #定时任务的规则

    *     # 每(分时日月周)都执行

    */5    # 每 5 (分时日月周)执行 每隔多长时间

    /5

    1-3     #时间范围 1-3 连续的时间 1点到3点

    1,3   #不连续的时间 1点和3点


    00 02 * * *      #每天的凌晨2点整

    00 02 1 * *      #每个月的1号凌晨2点整

    00 02 14 2 *      #每年的2月14日凌晨2点整

    00 02 * * 7     #每周日的凌晨2点整

    00 02 * 6 5      #每年的6月份的每周五的凌晨2点整

    00 02 14 * 7     #每个月的14号或者周日的凌晨2点整

    00 02 14 2 7     #每年的2月份的14号或者周日的凌晨2点整

    */10 02 * * *      #每天的凌晨2点每隔10分钟

    * * * * *        #每分钟

    00 00 14 2 *     #每年的2月份14号的凌晨0点整

    */5 * * * *       #每隔5分钟

    00 02 * 1,5,8 *     #每年的1和5和8月的每天的凌晨2点整

    00 02 1-8 * *     #每个月的1到8号的凌晨2点整

    00 21 * * *        #每天晚上21点整

    45 4 1,10,22 * *     #每个月的1,10,22号 的凌晨4点45分

    45 4 1-10 * *      #每个月的1到10号的凌晨4点45分

    3,15 8-11 */2 * *      #每个月每隔两天的8到11点的3分和15分的时候

    0 23-7/2 * * *      #每天的23点到7点的每隔2个小时的整点

    15 21 * * 1-5     #每周一到周五的晚上21点15分

     

    三、定时任务与案例

    1. 定时同步系统时间 每分钟同步

    [root@jindada ~]# ntpdate ntp.aliyun.com
    31 Jul 10:27:12 ntpdate[13673]: step time server 203.107.6.88 offset -28797.933639 sec
    [root@jindada ~]# date
    Fri Jul 31 10:27:18 CST 2020


    定时任务最好加上注释 作者 时间

    [root@jindada ~]# crontab -e
    no crontab for root - using an empty one
    crontab: installing new crontab
    [root@jindada ~]# crontab -l
    #同步系统时间 jindada 20200731_10
    * * * * * ntpdate ntp.aliyun.com

    #修改时间
    [root@jindada ~]# date -s 20200730
    Thu Jul 30 00:00:00 CST 2020
    [root@jindada ~]# date
    Thu Jul 30 00:00:02 CST 2020

    #查看定时任务的执行过程

    [root@jindada ~]# tailf /var/log/cron
    Jul 31 17:01:01 jindada run-parts(/etc/cron.hourly)[13622]: finished 0anacron
    Jul 31 17:52:01 jindada crontab[13651]: (root) LIST (root)
    Jul 31 18:01:01 jindada CROND[13656]: (root) CMD (run-parts /etc/cron.hourly)
    Jul 31 18:01:01 jindada run-parts(/etc/cron.hourly)[13656]: starting 0anacron
    Jul 31 18:01:01 jindada run-parts(/etc/cron.hourly)[13665]: finished 0anacron
    Jul 31 10:27:49 jindada crontab[13675]: (root) BEGIN EDIT (root)
    Jul 31 10:30:30 jindada crontab[13675]: (root) REPLACE (root)
    Jul 31 10:30:30 jindada crontab[13675]: (root) END EDIT (root)
    Jul 31 10:30:36 jindada crontab[13677]: (root) LIST (root)
    Jul 30 00:00:03 jindada CROND[13682]: (root) CMD (ntpdate ntp.aliyun.com)

    #查看接收的邮件发现了报错 说命令找不到

    [root@jindada ~]# ll /var/spool/mail/root
    -rw------- 1 root mail 3541 Jul 30 00:01 /var/spool/mail/root
    [root@jindada ~]# tailf /var/spool/mail/root
    X-Cron-Env: <SHELL=/bin/sh>
    X-Cron-Env: <HOME=/root>
    X-Cron-Env: <PATH=/usr/bin:/bin>
    X-Cron-Env: <LOGNAME=root>
    X-Cron-Env: <USER=root>
    Message-Id: <20200729160201.064E8802C9EE@jindada.localdomain>
    Date: Thu, 30 Jul 2020 00:02:01 +0800 (CST)

    /bin/sh: ntpdate: command not found


    #重新编写定时任务

    [root@jindada ~]# crontab -l
    #同步系统时间 jindada 20200731_10
    * * * * * /usr/sbin/ntpdate ntp.aliyun.com


    [root@jindada ~]# tailf /var/log/cron
    Jul 30 00:01:01 jindada run-parts(/etc/cron.hourly)[13694]: starting 0anacron
    Jul 30 00:01:02 jindada anacron[13707]: Anacron started on 2020-07-30
    Jul 30 00:01:02 jindada anacron[13707]: Normal exit (0 jobs run)
    Jul 30 00:01:02 jindada run-parts(/etc/cron.hourly)[13709]: finished 0anacron
    Jul 30 00:02:01 jindada CROND[13714]: (root) CMD (ntpdate ntp.aliyun.com)
    Jul 30 00:03:01 jindada CROND[13722]: (root) CMD (ntpdate ntp.aliyun.com)
    Jul 30 00:03:31 jindada crontab[13728]: (root) BEGIN EDIT (root)
    Jul 30 00:03:38 jindada crontab[13728]: (root) REPLACE (root)
    Jul 30 00:03:38 jindada crontab[13728]: (root) END EDIT (root)
    Jul 30 00:03:43 jindada crontab[13730]: (root) LIST (root)

     

    Jul 30 00:04:01 jindada crond[6003]: (root) RELOAD (/var/spool/cron/root)
    Jul 30 00:04:01 jindada CROND[13734]: (root) CMD (/usr/sbin/ntpdate ntp.aliyun.com)
    Jul 31 10:35:04 jindada CROND[13741]: (root) CMD (/usr/sbin/ntpdate ntp.aliyun.com)

    #邮件正在一直接收信息 导致邮件过大

    [root@jindada ~]# ll /var/spool/mail/root
    -rw------- 1 root mail 7028 Jul 31 10:35 /var/spool/mail/root
    [root@jindada ~]# ll /var/spool/mail/root
    -rw------- 1 root mail 7929 Jul 31 10:36 /var/spool/mail/root

    #停掉邮件服务 日志不在发生变化

    [root@jindada ~]# systemctl stop postfix
    [root@jindada ~]# ll /var/spool/mail/root
    -rw------- 1 root mail 8829 Jul 31 10:37 /var/spool/mail/root

    #但是会一直生成小文件

    [root@jindada ~]# ll /var/spool/postfix/maildrop/
    total 12
    -rwxr--r-- 1 root postdrop 601 Jul 31 10:38 7FF40C0CD48D
    -rwxr--r-- 1 root postdrop 600 Jul 31 10:39 A8919C0CD48E
    -rwxr--r-- 1 root postdrop 601 Jul 31 10:40 CD943C0CD48F


    #重新编写定时任务

    [root@jindada ~]# crontab -l
    #同步系统时间 jindada 20200731_10
    * * * * * /usr/sbin/ntpdate ntp.aliyun.com &>/dev/null

    [root@jindada ~]# systemctl start postfix

    [root@jindada ~]# ll /var/spool/mail/root
    -rw------- 1 root mail 13469 Jul 31 10:43 /var/spool/mail/root

    2. 把系统的时间追加到一个文件中

    [root@jindada ~]# date +%F_%T >> /root/time.txt
    [root@jindada ~]# cat /root/time.txt
    2020-07-31_10:51:45


    [root@jindada ~]# crontab -l
    #同步系统时间 jindada 20200731_10
    * * * * * /usr/sbin/ntpdate ntp.aliyun.com &>/dev/null
    #xxxxxxxxxx
    * * * * * /usr/bin/date +%F_%T >> /root/time.txt


    [root@jindada ~]# tailf /var/log/cron
    Jul 31 10:54:01 jindada crond[6003]: (root) RELOAD (/var/spool/cron/root)
    Jul 31 10:54:01 jindada CROND[14046]: (root) CMD (/usr/sbin/ntpdate ntp.aliyun.com &>/dev/null)
    Jul 31 10:54:01 jindada CROND[14047]: (root) CMD (/usr/bin/date +)


    #修改定时任务

    [root@jindada ~]# crontab -l
    #同步系统时间 jindada 20200731_10
    * * * * * /usr/sbin/ntpdate ntp.aliyun.com &>/dev/null
    #xxxxxxxxxx
    * * * * * /usr/bin/date +\%F_\%T >> /root/time.txt

     

    [root@jindada ~]# tailf /var/log/cron
    Jul 31 10:56:01 jindada crond[6003]: (root) RELOAD (/var/spool/cron/root)
    Jul 31 10:56:01 jindada CROND[14074]: (root) CMD (/usr/bin/date +%F_%T >> /root/time.txt )


    [root@jindada ~]# cat time.txt
    2020-07-31_10:56:01


    总结:

    定时任务中,有些特殊字符不识别,需要转义

    3. 备份/etc/目录 压缩包名带有时间戳 保留最近的3天数据

    [root@jindada ~]# cat backup.sh
    #!/bin/bash
    #重新定义环境变量
    export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/.local/bin:/root/bin
    #1.创建备份目录
    mkdir -p /backup
    #2.开始备份
    cd /
    tar czf /backup/etc_$(date +%F_%M).tar.gz etc/
    #3.删除3天以前的数据
    find /backup -type f -mtime +3 -name "*.tar.gz" -delete


    [root@jindada ~]# sh backup.sh
    [root@jindada ~]# ll /backup/
    total 9972
    -rw-r--r-- 1 root root 10210944 Jul 31 11:05 etc_2020-07-31_05.tar.gz

    #批量执行

    [root@jindada ~]# for i in {20..31};do date -s 2020/07/$i && sh /root/backup.sh ;done


    #编写定时任务
    [root@jindada ~]# crontab -l
    #同步系统时间 jindada 20200731_10
    * * * * * /usr/sbin/ntpdate ntp.aliyun.com &>/dev/null
    #xxxxxxxxxx
    * * * * * /usr/bin/date +\%F_\%T >> /root/time.txt
    #备份
    * * * * * /bin/bash /root/backup.sh &>/dev/null


    [root@jindada ~]# tailf /var/log/cron
    Jul 31 11:10:01 jindada crond[6003]: (root) RELOAD (/var/spool/cron/root)
    Jul 31 11:10:01 jindada CROND[14327]: (root) CMD (/usr/bin/date +%F_%T >> /root/time.txt )
    Jul 31 11:10:01 jindada CROND[14328]: (root) CMD (/bin/bash /root/backup.sh &>/dev/null)
    Jul 31 11:10:01 jindada CROND[14329]: (root) CMD (/usr/sbin/ntpdate ntp.aliyun.com &>/dev/null)


    [root@jindada ~]# ll /backup/
    total 59832
    -rw-r--r-- 1 root root 10210944 Jul 28 00:00 etc_2020-07-28_00.tar.gz
    -rw-r--r-- 1 root root 10210944 Jul 29 00:00 etc_2020-07-29_00.tar.gz
    -rw-r--r-- 1 root root 10210944 Jul 30 00:00 etc_2020-07-30_00.tar.gz
    -rw-r--r-- 1 root root 10210944 Jul 31 00:00 etc_2020-07-31_00.tar.gz
    -rw-r--r-- 1 root root 10210944 Jul 31 11:05 etc_2020-07-31_05.tar.gz
    -rw-r--r-- 1 root root 10210944 Jul 31 11:10 etc_2020-07-31_10.tar.gz

    四、定时发邮件

    [root@jindada ~]# yum install -y mailx

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

    #发件人

    set from=xxx@qq.com
    #邮件服务器

    set smtp=smtp.qq.com
    #发件人用户名

    set smtp-auth-user=xxx@qq.com
    #发件人密码(QQ邮箱不可以使用密码,只能使用授权码)

    set smtp-auth-password=xxx
    #登录方式

    set smtp-auth=login
    #邮件服务器协议及端口

    set smtp=smtps://smtp.qq.com:465
    #忽略证书

    set ssl-verify=ignore
    #指定证书位置

    set nss-config-dir=/etc/pki/nssdb/

    #或者指定别的证书位置,创建证书目录

     

    #放到最后
    set from=xxx@qq.com
    set smtp=smtp.qq.com
    set smtp-auth-user=xxx@qq.com
    set smtp-auth-password=xxx #客户端的授权码
    set smtp-auth=login
    set smtp=smtps://smtp.qq.com:465
    set ssl-verify=ignore
    set nss-config-dir=/etc/pki/nssdb/


    [root@jindada ~]# echo "test" | mail -s "hello" xxxx@qq.com
    [root@jindada ~]# Error in certificate: Peer's certificate issuer has been marked as not trusted by the. #忽略这个错误


    [root@jindada ~]# mkdir qingshu
    [root@jindada ~]# cd qingshu
    [root@jindada qingshu]# vim qingshu1.txt
    [root@jindada qingshu]# mail -s "致亲爱的小姐姐" xxx@qq.com < qingshu1.txt
    [root@jindada qingshu]# Error in certificate: Peer's certificate issuer has been marked as not trusted by the.


    #编写自动化脚本

    [root@jindada qingshu]# cat /root/send_mail.sh
    #!/bin/bash
    Qingshu=$(ls -1 /root/qingshu/ |head -1)
    mail -s "致亲爱的小姐姐" xxxx@qq.com < /root/qingshu/$Qingshu
    mail -s "致亲爱的小姐姐" xxxx@qq.com < /root/qingshu/$Qingshu

    if [ $? -eq 0 ];then
    rm -f /root/qingshu/$Qingshu
    fi


    [root@jindada qingshu]# ll
    total 20
    -rw-r--r-- 1 root root 85 Jul 31 11:49 qingshu1.txt
    -rw-r--r-- 1 root root 184 Jul 31 11:51 qingshu2.txt
    -rw-r--r-- 1 root root 121 Jul 31 11:51 qingshu3.txt
    -rw-r--r-- 1 root root 155 Jul 31 11:51 qingshu4.txt
    -rw-r--r-- 1 root root 70 Jul 31 11:52 qingshu5.txt


    #编写定时任务

    [root@jindada qingshu]# crontab -l
    #同步系统时间 jindada 20200731_10
    * * * * * /usr/sbin/ntpdate ntp.aliyun.com &>/dev/null
    #xxxxxxxxxx
    #* * * * * /usr/bin/date +\%F_\%T >> /root/time.txt
    #备份
    #* * * * * /bin/bash /root/backup.sh &>/dev/null
    #xxxxxxxxx
    * * * * * /bin/bash /root/send_mail.sh &>/dev/null

     

    五、定时任务总结

    思路:

    1.手动执行命令,然后保留执行成功的结果。

    2.编写脚本

    脚本需要统一路径/scripts
    脚本内容复制执行成功的命令(减少每个环节出错几率)

    3.执行脚本

    使用bash命令执行, 防止脚本没有增加执行权限(/usr/bin/bash /bin/bash)
    执行脚本成功后,复制该执行的命令,以便写入cron

    4.编写定时任务

    加上必要的注释信息, 人、时间、任务

    设定定时任务执行的周期

    粘贴执行脚本的命令(不要手敲)

    5.调试定时任务

    增加任务频率测试

    检查环境变量问题(最好在脚本中重新定义环境变量PATH)

    检查crond服务日志


    总结:

    1.定时任务规则之前加注释

    2.使用脚本执行定时任务(只有一条简单命令的可以直接使用命令执行)

    3.运行脚本一定要用绝对路径执行,统一脚本位置。

    4.定时任务中date命令的百分号需转义才能使用。

    5.命令或脚本结果(正确及错误)定向到空(>/dev/null 2>&1)或追加到文件中 >>/tmp/oldboy.txt 2>&1

    6.避免不必要的程序及命令输出,如打包命令,tar -v的显示过程的选项。

    7.打包压缩使用相对路径(切到目标目录的上一级打包目标)

    8.定时任务脚本中的程序文件 ,尽量用绝对路径,用户的定时任务中的文件默认存放在当前用户的家目录

    9.系统与命令位置有关的环境变量问题,建议脚本中重新定义环境变量PATH。

  • 相关阅读:
    讨喜的隔离可变性(十三)角色的特性
    讨喜的隔离可变性(十三)角色的特性
    解锁不可见索引新特性,处理ORA-01555故障
    django url 正则匹配
    django 往session写信息
    django 判断用户是否登录
    django 管理session
    Python爬虫入门教程 1-100 CentOS环境安装
    django session管理
    案发现场:被注入的软件及 ORA-600 16703 灾难的恢复
  • 原文地址:https://www.cnblogs.com/jhno1/p/13411837.html
Copyright © 2011-2022 走看看