Linux 计划任务 Cron

时间:2021-04-16 14:20:05

难题

---每分钟要执行某个程序检查服务的运行
---每天要对数据进行备份
---每月要对日志进行备份
......
如果你也存在这样的问题,Cron将可以帮助你从繁重的工作中解脱出来。

--------------------------------------------------------------------------------

1、Cron是什么
    Cron是计划任务,它保证了某个程序在特定的时间内的准确执行。要安排任何一个cron,就必须有负责这个cron的服务,linux经常用到的服务有atd和crond。
    这里注意: 虽然启动了cron服务,但其并不会监听端口,因为无需于外界通信,所以只是会开启一个进程。叫做独立守护进程。但是像httpd这样的独立守护进程,因为要通信,所以其不论是客户端,还是服务器端,都是要打开端口的。 
2、Cron之at
    单时间点执行某任务,而不循环,依赖于atd服务
    <1>配置文件
        /etc/at.aloow
        /etc/at.deny
        配置文件,白名单优先级更高,分为以下几种情况
        第一种:白名单和黑名单都存在
                只允许白名单中的用户创建计划任务
        第二种:只存在白名单
                只允许白名单中用户创建计划任务
        第三种:只存在黑名单
                除黑名单以外的用户都可以创建计划任务
        第四种:黑白名单都不存在
                除root以外,任何用户不能创建计划任务
    <2>执行方式
        交互式 
        输入重定向
        at -f FILE
    <3>时间表示法

          HH:MM 02:00
            在今日的HH:MM 进行,若该时刻已过,则明天此时执行任务
          HH:MM YYYY-MM-DD 04:00 2016-09-20
            规定在某年某月的某一天的特殊时刻进行该项任务
          HH:MM[am|pm] [Month] [Date]
            04pm March 17
            17:20 tomorrow
          HH:MM[am|pm] + number [minutes|hours|days|weeks]
            now + 5 minutes
            04pm + 3 days
          在某个时间点再加几个时间后才进行该项任务

    <4>常见用法
        at -l:列出当前系统中等待的作业,相当与atq
        at -d:删除指定的作业,相当于atrm
        at -f FILE:从指定的文件中读取任务
        at -m:任务结束后,发送邮件(例如make、rm等,测试任务的完成状态)
        注意: 有标准输出或者错误输出时,才会发送邮件
3、Cron之crontab
  多时间点循环执行某任务,依赖于crond服务
    <1>环境安装
    要实现cron,要安装主程序包cronie、cronie-anacron和crantabs
    cronie:主程序包,提供crond进程服务。提供crontab工具。
    cronie-anacron:辅助程序包,用于移动设备中那些因为各种原因而无法正常执行的系统任务。服务器中很少用到。生成/etc/anacrontab,定义未正常执行的系统任务。
    crontabs:提供系统正常的系统任务。生成/etc/crontab系统级计划任务。
    <2>Cron分为用户级别和计划任务和系统级别的计划任务
      用户级别的计划任务直接使用crontab定义(用户也可以直接编辑/etc/crontab,只不过修改MAILTO参数)
      系统级别的的计划任务在/etc/cron.d中
[root@CentOS7/etc/cron.d]#ls    //在此目录下直接编辑文件也可以
0hourly  raid-check  sysstat   
[root@centos7/etc/cron.d]#   
[root@centos7/etc/cron.d]#vim 0hourly    //0hourly是每小时任务
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly    //生效的文件在/etc/cron.hourly
[root@centos7/etc/cron.hourly]#ls
0anacron  0yum-hourly.cron    //0anacron保证了/etc/anacrontab计划任务的执行
                              //0yum-hourly.cron同理
[root@centos7/etc/cron.hourly]#vim /etc/anacrontab    //真正定义anacrontab的文件,包括
                                                        /etc/cron.daily、/etc/cron.monthly
                                                        /etc/cron.weekly等文件中

      注意:系统级任务调度主要完成系统的一些维护操作,用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议这么做),但是反过来却不行。
      cron的工作模式


  <3>crontab工具的使用 
      书写格式

Linux 计划任务 Cron



      常见用法
        crontab -e:定义当前用户的计划任务,
                      保存在/var/spool/cron中
          crontab -e -u USER: 修改指定用户的计划任务
          crontab -u USER -l:查看指定用户的计划任务,
                      只有root可以查看
          crontab -r:移除所有的计划任务
      注意:crontab是拥有suid权限,所以当root修改了普通用户的计划任务之后,用户是可以再次修改的,但是是无法直接修改root的计划任务的。
    <4>时间表示法
      (1)特定值:
          给定时间点有效取值范围内的值
      (2)*
          给定时间点上有效取值范围内的所有值
          表示“每...”
      (3)离散取值:
          #,#,#
      (4)连续取值:-
          #-#
      (5)在指定时间范围上,定义步长:
          /#: #即为步长   
  <5>配置文件
      /etc/cron.deny:定义了所有不允许使用crantab的用户列表
      /etc/cron.allow:定义了所有允许使用crantab的用户列表
      /var/spool/cron/USER:用户定义的计划任务
      /var/spool/mail/USER:用户的邮件 
  <5>Cron常见错误
      环境变量不指定
[root@centos7~]#vim echo.sh
#!/bin/bash
wall everyone..
[root@centos7~]#vim /etc/crontab 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin    //注意:此处的环境变量
MAILTO=root
...
[root@centos7~]#crontab -e
* * * * * echo.sh    //错误,环境变量中不存在

      命令书写格式错误
0 * * * * tar -Jcf /backup/etc-`date +%F-%H`.tar.xz /etc/    //格式误,%要转义
# 正确的格式
0 */5 * * * tar -Jcf /backup/etc-`date +\%F-\%H`.tar.xz /etc/
 
    date +%w:显示星期几

      时间域不明确
# 第一个域和第三个域是或关系
0 0 1-7 1 1  hostname    //表示一月第一个星期或者一月的每周一,执行hosrname
                          而不是一月的第一个星期的星期一

      分钟设置误用
# 每俩小时执行一下/etc/echo.sh
* */2 * * * * etc/echo.sh    //错误:这表示每分钟执行一次
# 正确的格式
0 */2 * * * * etc/echo.sh

注意:在crontab中,精度最高只能到分钟级别,如果要使用秒级别的话,可在脚本中使用sleep
也可以
*/1 * * * * sleep 30 date >> /tmp/f1 &> /dev/null

--------------------------------------------------------------------------------

强化练习:

1、每天的2点整和12点整,将/etc目录至/backup目录中,保存的文件名称格式为“etc-yyyy-mm-dd-HH.tar.xz”   
0 2,12 * * * tar -Jcf /backup/etc-`date +\%F-\%H`.tar.gz /etc/*

2、每周2, 4, 7备份/var/log/messages文件至/logs目录中,文件名形如“messages-yyyymmdd 
0 0 * * 2,4,7 cp -a /var/log/message /log/massage-`date +\%F`

3、每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中
 0 */2 * * * cat /proc/meminfo | grep "^[SM]" >> /tmp/meminfo.txt

4、工作日时间,每10分钟执行一次磁盘空间检查,一旦发现任何分区利用率高于80%,就执行wall警报
[root@centos7~/bin]#vim cron.sh
#!/bin/bash
HI=`df | grep "^/dev/sd[a-h]" | tr -s ' ' '%' | cut -d'%' -f 5`
if [ $HI -lt 80 ]; then
  wall dangerous
fi
[root@centos7~/bin]#crontab -e
*/10 * * * 1-5 /root/bin/cron.sh