zoukankan      html  css  js  c++  java
  • Linux 任务计划

    Linux任务计划
      什么是任务计划呢?就像我们每个人日常生活中都会使用到的闹钟一样,按时的去提醒该去做什么事情,以免忘记。同样,我们在工作当中也要在每天在特定的时间内安排做一些事情,这就是任务计划,本章将学习如何制定Linux系统的任务计划,这里主要包括两种工具:at 和 crontab
      未来的某时间点执行一次任务:at、batch
      周期性运行某任务:cron

    电子邮件服务:
      smtp:simple mail transmission protocol,简单邮件传输协议,用于传送邮件
      pop3:Post Office Protocol,邮局协议
      imap4:Internet Mail Access Protocol,互联网邮件访问协议

      mailx - send and receive Internet mail
      MUA:Mail User Agent
      使用mail命令发送邮件
      mailx [-s 'Subject'] username[@hostname]
        邮件正文的生成:
        1、直接编辑,通过Ctrl+d结束邮件编辑并发送
        mail -s 'Hello' king@localhost
        2、通过文件输入重定向
        mail -s 'Hello' king@localhost < Mail_File
        3、通过管道;
        echo -e "How are you?" | mail -s 'Hello' king@localhost

    at命令:某时间点执行一次任务
    at是由atd提供服务的,在使用之前要确认是否开启
      CentOS 6:service atd {status|start}
      CentOS 7:systemctl {status|start} atd

      at [option] TIME
      TIME格式:
      规定在某年某月的某一天的某个时间点执行该任务
        HH:MM [YYYY-mm-dd]
        noon, midnight, teatime,tomorrow
      在某个时间点过后多长时间执行该任务
        now+#{minutes,hours,days, weeks}
      常用选项:
      -q QUEUE 查询指定任务队列(默认只有一个队列a)
      -l 列出指定队列中等待运行的作业;相当于atq命令
      -d 删除指定的作业;相当于atrm命令
      -c 查看具体作业任务
      -f /path/from/somefile 从指定的文件中读取任务
      -m 强制at发送邮件,表示执行完毕
      注意:作业执行命令的结果中的标准输出和错误以邮件通知给相关用户

      执行方式:交互式、输入重定向、at –f 文件;依赖于atd服务,需要该启动才能实现at任务
      at队列存放在/var/spool/at目录中;/etc/at.{allow,deny}控制用户是否能执行at任务
        白名单:/etc/at.allow 默认不存在,当at.allow存在时只有该文件中的用户才能执行at命令,不在此文件的用户不允许
        黑名单:/etc/at.deny 默认存在,拒绝该文件中用户执行at命令,而没有在at.deny 文件中的使用者则可执行
        如果两个文件都存在时,at.allow的优先级高;如果两个文件都不存在,只有 root 可以执行 at 命令

    示例:
    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

    演示:
    # 设定计划任务,在2分钟后执行
    [root@centos7 ~]# at now+2min
    at> cat /etc/issue
    at> ls /var
    at> echo "hello there."
    at> <EOT> # 按 Ctrl+d 提交
    job 1 at Fri Feb 24 15:49:00 2017

    # 查看计划任务
    [root@centos7 ~]# at -l
    1 Fri Feb 24 15:49:00 2017 a root

    # 从指定文件中读取任务,不在交互式输入
    [root@centos7 ~]# at -f at.tasks now+5min
    job 2 at Fri Feb 24 16:08:00 2017

    [root@centos7 ~]# at -l
    2 Fri Feb 24 16:08:00 2017 a root
    [root@centos7 ~]# atq
    2 Fri Feb 24 16:08:00 2017 a root

    # 指明任务编号,删除任务 相当于atrm
    [root@centos7 ~]# at -d 2
    [root@centos7 ~]# atq

    [root@centos7 ~]# at -f at.tasks now+5min
    job 3 at Fri Feb 24 16:09:00 2017
    [root@centos7 ~]# atq
    3 Fri Feb 24 16:09:00 2017 a root
    [root@centos7 ~]# atrm 3
    [root@centos7 ~]# atq

    batch命令:让系统自行选择空闲时间(CPU负载小于0.8的时候)去执行此处指定的任务;

    cron周期性任务计划:
      相关的程序包:
      cronie:主程序包,提供了crond守护进程及相关辅助工具
      cronie-anacron:cronie的补充程序;用于监控cronie任务执行状况;如cronie中的任务在过去该运行的时间点未能正常运行,则anacron会随后运行一次该任务
      crontabs:包含CentOS提供系统维护任务

      需要周期性任务计划正确执行,要确保crond守护进程处于运行状态:
      CentOS 7:systemctl status crond
      CentOS 6:service crond status

      计划要周期性执行的任务提交给crond,由其来实现到点运行。
      系统cron任务:系统维护作业
        /etc/crontab
      用户cron任务:
        crontab命令

      系统cron任务/etc/crontab
      # 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

      例如:晚上9点10分运行echo命令;
      10 21 * * * gentoo /bin/echo "Howdy!"

      时间表示法:
      1、特定值:给定时间点有效取值范围内的值
      示例:
        3 * * * *:每小时执行一次,每小时的第三分钟
        3 4 * * 5:每周执行一次,每周五的4点3分
        5 6 7 * *:每月执性一次,每月的7号6点5分
        7 8 9 10 *:每年执行一次,每年的10月9号8点7分

      2、*:给定时间点上有效取值范围内的所有值;表示"每"
      3、离散取值:#,#,#
      示例:
        9 8 * * 3,7:每周三和周日的8点9分
        0 8,20 * * 3,7:每周三和周日的8点和20点

      4、连续取值:#-#
      示例:
        0 9-18 * * 1-5:周一到周五(工作时间)内的每小时执行

      5、在指定时间范围上,定义步长:/#  #即为步长
      示例:
        0 */3 * * *:每3小时执行一次任务
        */5 * * * *:每5分钟执行一次任务
      注意:
      指定的时间点不能被步长整除时,其意义将不复存在
      最小时间单位为"分钟",想完成"秒"级任务,的需要额外借助其它机制(定义成每分钟任务,而再利用脚本实现每分钟之内,循环执行多次)

      用户cron任务:
      crontab命令定义,每个用户都有专用的cron任务文件:/var/spool/cron/USERNAME
      crontab命令:crontab [-u user] [-l | -r | -e] [-i]
        -l 列出所有任务
        -e 编辑任务
        -r 移除所有任务
        -i 同-r一同使用,以交互式模式让用户有选择地移除指定任务
        -u user 仅root可运行,为指定用户管理cron任务
      cron 执行的每一项工作都会被纪录到/var/log/cron

      注意:运行结果以邮件通知给相关用户;也可以将命令执行结果重定向
      COMMAND > /dev/null
      COMMAND &> /dev/null
      对于cron任务来讲,%有特殊用途;如果在命令中要使用%,则需要转义;也可以把%放置于单引号中就不需要转义;

      如何在秒级别运行任务?
      * * * * * for min in 0 1 2; do echo "hi"; sleep 20; done
      sleep命令:
      sleep Number[SUFFIX]...
      SUFFIX:
       s 秒(默认)
       m 分
       h 小时
       d 天

    案例:
    每4小时备份一次/etc目录至/backup目录中,保存的文件名称格式为“etc-yyyy-mm-dd-HH”
    # mkdir /backup
    # crontab -e
    0 */4 * * * /bin/cp -a /etc /backup/etc-`date + '%F-%H'` > /dev/null

    每周2, 4, 7备份/var/log/messages文件至/logs目录中,文件名形如“messages-yyyymmdd”
    # mkdir /logs
    # crontab -e
    # 20 1 * * 2,4,0 /bin/cp -a /var/log/messages /logs/messages-`date +'%Y%m%d'` > /dev/null

    每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中
    # crontab -e
    # 0 */2 * * * /bin/grep -e '^S' -e '^M' /proc/meminfo >> /tmp/meminfo.txt

    工作日时间内,每两小时执行一次“ip addr show”命令
    # crontab -e
    # 0 9-17/2 * * 1-5 /sbin/ip addr show

  • 相关阅读:
    Bugku web web基础$_GET
    Bugku web 计算器
    Bugku web web2
    Bugku 杂项 宽带信息泄露
    Bugku 杂项 猜
    Bugku 杂项 又一张图片,还单纯吗
    Bugku 杂项 啊哒
    Bugku 杂项 眼见非实(ISCCCTF)
    Bugku 杂项 telnet
    Bugku 杂项 隐写
  • 原文地址:https://www.cnblogs.com/Link-Luck/p/9858218.html
Copyright © 2011-2022 走看看