zoukankan      html  css  js  c++  java
  • Linux 任务计划,周期性任务执行

    未来的某个时间点执行一次某任务的命令:atbatch

    命令执行的结果,会发送到任务发起者的邮箱

    周期性运行某任务:crontab

    命令执行的结果,会发送到任务发起者的邮箱

    本地邮件服务

    发邮件的协议:smtp(simple mail transmission protocol)

    收邮件的协议:

    • pop3(post office protocol)
    • imap4(Internet mail access protocol)

    查看本地邮件服务是否启动:netstat -tnlp

    如果25号端口处于监听状态,说明本地邮件服务是启动的。

    # netstat -tnlp
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
    tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      4313/master
    tcp6       0      0 ::1:25                  :::*                    LISTEN      4313/master
    

    mail命令

    用来收发邮件的,centos6用mail;centos7用mailx命令

    MUA:Mail user agent(用户收发邮件的工具程序)

    outlook就是mua。用网页收发邮件也是mua。

    发邮件(邮件正文是交互式输入):mail -s 'subject hi' us1[@192.168.2.4]

    如果发送的user和接收的user在同一天主机上,可以不写ip地址,直接写用户名。

    给us1发送标题为subject hi的邮件,邮件正文是回车后,输入的。

    正文输入完了:点号单独成行(点加回车),或者ctrl+d.

    # mail -s 'subject hi' us1
    how do you do
    .
    EOT
    
    

    us1查收邮件:直接输入mail

    会显示出邮件,然后输入邮件编号,比如1,就能看邮件正文了。

    输入q,退出。

    [us1@localhost ~]$ mail
    Heirloom Mail version 12.5 7/5/10.  Type ? for help.
    "/var/spool/mail/us1": 1 message 1 new
    >N  1 root                  Wed Feb 12 22:11  18/615   "subject hi"
    & 1
    Message  1:
    From root@localhost.localdomain  Wed Feb 12 22:11:27 2020
    Return-Path: <root@localhost.localdomain>
    X-Original-To: us1
    Delivered-To: us1@localhost.localdomain
    Date: Wed, 12 Feb 2020 22:11:27 +0800
    To: us1@localhost.localdomain
    Subject: subject hi
    User-Agent: Heirloom mailx 12.5 7/5/10
    Content-Type: text/plain; charset=us-ascii
    From: root@localhost.localdomain (root)
    Status: R
    
    how do you do
    
    & q
    Held 1 message in /var/spool/mail/us1
    
    

    发邮件(邮件正文是输入重定向):mail -s 'subject hi' us1[@192.168.2.4] < /etc/fstab

    # mail -s "hi2" root < /etc/fstab
    [root@localhost ~]# mail
    Heirloom Mail version 12.5 7/5/10.  Type ? for help.
    "/var/spool/mail/root": 1 message 1 new
    >N  1 root                  Wed Feb 12 22:20  29/1138  "hi2"
    & 1
    Message  1:
    From root@localhost.localdomain  Wed Feb 12 22:20:11 2020
    Return-Path: <root@localhost.localdomain>
    X-Original-To: root
    Delivered-To: root@localhost.localdomain
    Date: Wed, 12 Feb 2020 22:20:11 +0800
    To: root@localhost.localdomain
    Subject: hi2
    User-Agent: Heirloom mailx 12.5 7/5/10
    Content-Type: text/plain; charset=us-ascii
    From: root@localhost.localdomain (root)
    Status: R
    
    
    #
    # /etc/fstab
    # Created by anaconda on Fri Nov 29 16:44:28 2019
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    /dev/mapper/centos-root /                       xfs     defaults        0 0
    UUID=3d3b316a-529e-484a-9895-e785fdde5365 /boot                   xfs     defaults        0 0
    /dev/mapper/centos-home /home                   xfs     defaults        0 0
    /dev/mapper/centos-swap swap                    swap    defaults        0 0
    
    &
    

    发邮件(邮件正文是从管道得来):cat /etc/fsta | mail -s 'subject hi' us1[@192.168.2.4]

    # cat /etc/fstab | mail -s "hi3" root
    [root@localhost ~]# mail
    Heirloom Mail version 12.5 7/5/10.  Type ? for help.
    "/var/spool/mail/root": 2 messages 1 new
        1 root                  Wed Feb 12 22:20  30/1149  "hi2"
    >N  2 root                  Wed Feb 12 22:21  29/1138  "hi3"
    & 2
    Message  2:
    From root@localhost.localdomain  Wed Feb 12 22:21:03 2020
    Return-Path: <root@localhost.localdomain>
    X-Original-To: root
    Delivered-To: root@localhost.localdomain
    Date: Wed, 12 Feb 2020 22:21:03 +0800
    To: root@localhost.localdomain
    Subject: hi3
    User-Agent: Heirloom mailx 12.5 7/5/10
    Content-Type: text/plain; charset=us-ascii
    From: root@localhost.localdomain (root)
    Status: R
    
    
    #
    # /etc/fstab
    # Created by anaconda on Fri Nov 29 16:44:28 2019
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    /dev/mapper/centos-root /                       xfs     defaults        0 0
    UUID=3d3b316a-529e-484a-9895-e785fdde5365 /boot                   xfs     defaults        0 0
    /dev/mapper/centos-home /home                   xfs     defaults        0 0
    /dev/mapper/centos-swap swap                    swap    defaults        0 0
    
    &
    

    at命令

    可以作业的执行时间。

    命令执行的结果,会发送到任务发起者的邮箱

    at [option]... TIME

    TIME:HH:MM [YYYY-mm-dd]

    noon(中午12点),midnight(半夜12点),teatime(下午4点),tomorrow

    now+#(单位:min,hours,days,weeks):现在时间之后几分钟,小时,天,周

    • 按hh:mm方式,指定作业时间.

      如果指定的时间是当前时间之前,则就是明天的这个指定时间;如果是当前时间之后,就是今天的这个指定时间。

      ctrl+d:结束交互。

      # at 10:42
      at> ls /root
      at> echo "sdf"
      at> <EOT>
      job 2 at Thu Feb 13 10:42:00 2020
      [root@localhost ~]# atq
      1       Thu Feb 13 10:42:00 2020 a root
      
    • 按hh:mm YYYY-MM-DD方式,指定作业时间

      # mail
      Heirloom Mail version 12.5 7/5/10.  Type ? for help.
      "/var/spool/mail/root": 4 messages 1 new
          1 root                  Wed Feb 12 22:20  30/1149  "hi2"
          2 root                  Wed Feb 12 22:21  30/1149  "hi3"
          3 root                  Thu Feb 13 10:42  19/569   "Output from your job "
      >N  4 root                  Thu Feb 13 10:45  17/528   "Output from your job "
      & 4
      Message  4:
      ...
      
      Desktop
      Documents
      Downloads
      ys
      
    • 创建任务时,指定排队的队列的名字,不指定的话,所以用户的作业排队队列都是队列a

      当多个用户都创建作业了,而且还都是在同一个时间点,所以就需要排队,默认是在a队排队。

      在b队上排队:

      # at now+10min -q b
      at> ls /
      at> <EOT>
      job 6 at Thu Feb 13 11:23:00 2020
      [root@localhost ~]# atq
      5       Thu Feb 13 12:04:00 2020 a root
      6       Thu Feb 13 11:23:00 2020 b root
      
    • 查看作业队列:-l。或者命令atq

      # atq
      1       Thu Feb 13 10:42:00 2020 a root
      # at -l
      1       Thu Feb 13 10:42:00 2020 a root
      4       Fri Feb 14 10:45:00 2020 a root
      
    • 从指定脚本文件中读取作业命令,而不用交互式输入命令:-f FILE

      注意:脚本文件中的命令,不要写相对路径,最好写全路径(/usr/bin/ls)

      # cat work
      ls /
      echo "work"
      # at -f work now+1hours
      job 5 at Thu Feb 13 12:04:00 2020
      # atq
      5       Thu Feb 13 12:04:00 2020 a root
      
    • 删除还没有执行的作业:-d 作业号。或者atrm 作业号

      # at -l
      1       Thu Feb 13 10:42:00 2020 a root
      4       Fri Feb 14 10:45:00 2020 a root
      [root@localhost ~]# atrm 1
      [root@localhost ~]# at -l
      4       Fri Feb 14 10:45:00 2020 a root
      [root@localhost ~]# atrm 4
      [root@localhost ~]# at -l
      [root@localhost ~]#
      
    • 查看作业的具体内容:-c

      查看4号作业的内容:显示出的一堆,是说明要执行这个作业的bash环境。

      因为执行作业时,必须要知道执行者是谁,根据执行者决定能访问的资源权限,执行时当前的目录等等信息。

      # at -l
      1       Thu Feb 13 10:42:00 2020 a root
      4       Fri Feb 14 10:45:00 2020 a root
      # at -c 4
      #!/bin/sh
      # atrun uid=0 gid=0
      # mail root 0
      umask 22
      XDG_SESSION_ID=5; export XDG_SESSION_ID
      HOSTNAME=localhost.localdomain; export HOSTNAME
      SELINUX_ROLE_REQUESTED=; export SELINUX_ROLE_REQUESTED
      SHELL=/bin/bash; export SHELL
      HISTSIZE=1000; export HISTSIZE
      SSH_CLIENT=192.168.56.1 63391 22; export SSH_CLIENT
      SELINUX_USE_CURRENT_RANGE=; export SELINUX_USE_CURRENT_RANGE
      SSH_TTY=/dev/pts/2; export SSH_TTY
      USER=root; export USER
      LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:; export LS_COLORS
      MAIL=/var/spool/mail/root; export MAIL
      PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin; export PATH
      PWD=/root; export PWD
      LANG=en_US.UTF-8; export LANG
      SELINUX_LEVEL_REQUESTED=; export SELINUX_LEVEL_REQUESTED
      HISTCONTROL=ignoredups; export HISTCONTROL
      SHLVL=1; export SHLVL
      HOME=/root; export HOME
      LOGNAME=root; export LOGNAME
      XDG_DATA_DIRS=/root/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share; export XDG_DATA_DIRS
      SSH_CONNECTION=192.168.56.1 63391 192.168.56.107 22; export SSH_CONNECTION
      LESSOPEN=||/usr/bin/lesspipe.sh %s; export LESSOPEN
      XDG_RUNTIME_DIR=/run/user/0; export XDG_RUNTIME_DIR
      cd /root || {
               echo 'Execution directory inaccessible' >&2
               exit 1
      }
      ${SHELL:-/bin/sh} << 'marcinDELIMITER0730c9b3'
      ls /
      
      marcinDELIMITER0730c9b3
      
      

    batch

    会让系统自己选择在空闲的时间执行,其余用法和at一样。

    周期性任务

    必须启动一个后台的监视进程(crond),来监视时间,才能实现周期任务。

    监视进程的程序在程序包:cronie里,如果系统里没有crond程序,则需要安装程序包:cronie。

    安装办法:yum install cronie

    程序包:cronie提供了crond和相关辅助工具。

    查看监视进程(crond)是否已经启动:

    centos7:systemctl status crond

    # systemctl status crond
    Active: active (running)
    

    centos6:service crond status

    # service crond status
    ... is running
    

    向crond提交任务的方式不同于at,它需要使用专用的配置文件,此文件有固定格式,不建议使用文本编辑器直接编辑此文件,要使用crontab命令。

    cron任务分为2类:

    • 系统任务:只能通过编辑/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
      

      每一行定义一个周期任务:* * * * * user-name command to be executed

      • * * * * *:定义周期
      • user-name:以谁的身份执行此命令
      • command to be executed:要执行的周期性任务。

      PATH环境变量里的路径很少,所以就导致不在此路径里的命令,就找不到了,所以要自定义PATH环境变量,或者写命令的全路径

      执行结果以邮件发送,发送给MAILTO指定的用户

    • 用户任务:通过命令crontab来指定

      用户也可以使用配置文件/var/spool/cron/USERNAME,格式和系统的略有不同,没有user-name了,因为已经知道user是谁了。

      SHELL=/bin/bash
      PATH=/sbin:/bin:/usr/sbin:/usr/bin
      
      # 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
      # |  |  |  |  |
      # *  *  *  *  *  command to be executed
      

      每一行定义一个周期任务:* * * * * user-name command to be executed

      • * * * * *:定义周期
      • command to be executed:要执行的周期性任务。

      PATH环境变量里的路径很少,所以就导致不在此路径里的命令,就找不到了,所以要自定义PATH环境变量,或者写命令的全路径

      执行结果以邮件发送,发送给当前用户

    时间表示法

    • 特定值:给定范围内有效的值

      注意:星期和日期一般不同时使用。

    • *:有效范围内的所有值。意思是:每...

    • 离散取值:用逗号分隔。注意不能有空格

    • 连续取值:用-连接开始和结束

    • 在指定时间点上,定义步长:/#

      注意:如果不能整除,则没有意义,必须给能够整除的数字

      注意:crontab的最小时间单位是分钟,想定义秒级别的任务,需要额外的机制

      定义成每分钟的任务,在利用bash脚本实现每分钟内,循环多次。

    例子:

    • 3 * * * * :每小时执行一次。每小时的第3分钟执行
    • 3 4 * * 5:每周执行一次。每周5的04:03执行
    • 5 6 7 * *:每月执行一次。每月的7号的06:06执行
    • 1 2 3 4 *:每年执行一次。每年的4月3号的02:01执行
    • 9 8 * * 3,7:每周3和每日的08:09执行
    • 0 8,20 * * 3,7:每周3,周日的,8:00和20:00点执行
    • 10 9-18 * * 1-5:周一到周五,9点到18点,每小时执行一次;执行时间是9:10,10:10等等
    • */5 * * * *:每5分钟执行一次
    • 0 1 * * *:每小时执行一次,在每个小时的0分执行
    • * 1 * * *:1点开始,每分钟执行一次
    • 0 0 1 * *:每天执行一次,在00:00执行

    crontab命令

    1,编辑任务:-e。会自动打开vim编辑器。如果是第一次编辑,则会生成文件:/var/spool/cron/USERNAME。

    直接编辑文件也可以,但是保存后,不能指出编辑的语法错误。

    $ crontab -e
    no crontab for ys - using an empty one
    crontab: installing new crontab
    [root@localhost ~]# ll /var/spool/cron/ys
    -rw-------. 1 ys ys 27 Feb 13 14:49 /var/spool/cron/ys
    $ crontab -e
    crontab: installing new crontab
    "/tmp/crontab.ZFoGsu":2: bad day-of-week
    errors in crontab file, can't install.
    Do you want to retry the same edit?
    

    2,列出所有任务:-l

    $ crontab -l
    */2 * * * * echo "i am ys"
    * * * 1 * echo "haa"
    
    

    3,删除所有任务,并删除文件/var/spool/cron/USERNAME:-r

    $ crontab -l
    You have new mail in /var/spool/mail/ys
    # ll /var/spool/cron/ys
    ls: cannot access /var/spool/cron/ys: No such file or directory
    

    4,删除前,提示是否删除:-i

    $ crontab -ri
    crontab: really delete ys's crontab?
    

    5,管理指定用户的cron任务:-u

    root管理别的用户的任务。

    # crontab -u ys -l
    */10 * * * * echo "aaa"
    # crontab -eu ys
    crontab: installing new crontab
    [root@localhost ~]# crontab -lu ys
    */10 * * * * echo "aaa"
    * * * * 7 echo "ddd"
    

    6,任务的执行结果是发到执行者的邮箱的,如果不想接收邮件的话,使用重定向

    任务正确执行了,就不接收邮件;执行错了,接收邮件:> /dev/null

    不管任务执行结果的对错都不接收邮件:&> /dev/null

    # crontab -lu ys
    */1 * * * * echo "aaa" > /dev/null
    

    7,注意:当command里有%,必须转义,就是在%前加

    8,思考:某cron任务在指定的时间因关机等原因未能执行,下次开机会不会自动执行。

    不会!

    如果期望开机后自动执行一次,则使用anacron

    练习

    1,每12小时备份一次/etc目录到/backup目录中,保存文件为"etc-yyyy-mm-dd-hh.tar.xz"

    注意:第一位不能是*,要是*,就是每分钟都执行了

    0 12 * * * cd /backup/ && tar Jcf etc-$(date  +\%F-\%M).tar.xz -P /etc
    

    2,每周2,4,7备份/var/log/secure文件到/logs目录,文件名格式"secure-yyyymmdd"

    注意:第一位和第二位不能是*,要是前2位都是*,就是每分钟都执行了;第一位不是*,第二位是*的话,就是每小时的第几分执行。

    下面的意思是:每周2,4,7的16:14分执行。

    14 16 * * 2,4,7 cp /var/log/secure /logs/secure-$(date +\%Y\%m\%d)
    

    3,每2小时取出当前系统/proc/meminfo文件中以S或M开头的信息,追加到/tmp/meminfo文件中

    */120 * * * * cat /proc/meminfo | grep "^[S|M]" >> /tmp/meminfo
    
    # c/c++ 学习互助QQ群:877684253 ![](https://img2018.cnblogs.com/blog/1414315/201811/1414315-20181106214320230-961379709.jpg) # 本人微信:xiaoshitou5854
  • 相关阅读:
    P1121 环状最大两段子段和
    无题
    cdoj 1485 柱爷搞子串 sam treap
    自然数幂和
    Gym 100341C AVL Trees NTT
    线性筛分解质因子
    codeforces 366 Ant Man dp
    UVALive 6914 Maze Mayhem 轮廓线dp
    hdu 5790 Prefix 字典树 主席树
    莫比乌斯反演个人小结
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/12305763.html
Copyright © 2011-2022 走看看