• 20220920 15. 例行性工作调度(crontab)


    15.1 什么是例行性工作调度

    Linux 调度就是通过 crontab 与 at

    15.1.1 Linux 工作调度的种类: at, cron

    两种工作调度的方式:

    • 一种是例行性的,就是每隔一定的周期要来办的事项;

    • 一种是突发性的,就是这次做完以后就没有的那一种

    使用 at 与 crontab

    • at :at 是个可以处理仅执行一次就结束调度的指令,不过要执行 at 时, 必须要有 atd 这 个服务 (第十七章) 的支持才行。在某些新版的 distributions 中,atd 可能默认并没有 启动,那么 at 这个指令就会失效呢!不过我们的 CentOS 默认是启动的!

    • crontab :crontab 这个指令所设置的工作将会循环的一直进行下去! 可循环的时间为分 钟、小时、每周、每月或每年等。crontab 除了可以使用指令执行外,亦可编辑 /etc/crontab 来支持。 至于让 crontab 可以生效的服务则是 crond 这个服务

    15.1.2 CentOS Linux 系统上常见的例行性工作

    Linux 系统常见的例行性任务有:

    • 进行登录文件的轮替 (log rotate)

    • 登录文件分析 logwatch 的任务

    • 创建 locate 的数据库

    • man page 查询数据库的创建

    • RPM 软件登录文件的创建

    • 移除暂存盘

    • 与网络服务有关的分析行为

    15.2 仅执行一次的工作调度

    15.2.1 atd 的启动与 at 运行的方式

    并非所有的 Linux distributions 都默认会把 atd 服务打开的

    systemctl status atd # 查阅一下 atd 目前的状态
    systemctl restart atd # 重新启动 atd 这个服务
    systemctl enable atd # 让这个服务开机就自动启动
    
    [root@VM-72-146-centos ~]# systemctl status atd
    ● atd.service - Job spooling tools
       Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enable    # 是否开机启动
       Active: active (running) since Mon 2021-11-22 18:13:18 CST; 9 months 28 days ago        # 是否正在运行中
     Main PID: 1907 (atd)
        Tasks: 1
       Memory: 580.0K
       CGroup: /system.slice/atd.service
               └─1907 /usr/sbin/atd -f
    

    at 的运行方式

    我们使用 at 这个指令来产生所要运行的工作,并 将这个工作以文本文件的方式写入 /var/spool/at/ 目录内,该工作便能等待 atd 这个服务的取 用与执行了

    我们可以利用 /etc/at.allow 与 /etc/at.deny 这两个文件来进行 at 的使用限制

    1. 先找寻 /etc/at.allow 这个文件,写在这个文件中的使用者才能使用 at ,没有在这个文件 中的使用者则不能使用 at (即使没有写在 at.deny 当中);

    2. 如果 /etc/at.allow 不存在,就寻找 /etc/at.deny 这个文件,若写在这个 at.deny 的使用者 则不能使用 at ,而没有在这个 at.deny 文件中的使用者,就可以使用 at 咯;

    3. 如果两个文件都不存在,那么只有 root 可以使用 at 这个指令。

    在一般的 distributions 当中,由于假设系 统上的所有用户都是可信任的, 因此系统通常会保留一个空的 /etc/at.deny 文件,意思是允 许所有人使用 at 指令的意思

    15.2.2 实际运行单一工作调度

    [root@www ~]# at [-mldv] TIME
    [root@www ~]# at -c 工作号码
    选项与参数:
    -m  :当 at 的工作完成后,即使没有输出信息,亦以 email 通知使用者该工作已完成。
    -l  :at -l 相当於 atq,列出目前系统上面的所有该使用者的 at 排程;
    -d  :at -d 相当於 atrm ,可以取消一个在 at 排程中的工作;
    -v  :可以使用较明显的时间格式列出 at 排程中的工作列表;
    -c  :可以列出后面接的该项工作的实际命令内容。
    
    TIME:时间格式,这里可以定义出『什么时候要进行 at 这项工作』的时间,格式有:
      HH:MM                
          ex> 04:00
        在今日的 HH:MM 时刻进行,若该时刻已超过,则明天的 HH:MM 进行此工作。
      HH:MM YYYY-MM-DD        
          ex> 04:00 2009-03-17
        强制规定在某年某月的某一天的特殊时刻进行该工作!
      HH:MM[am|pm] [Month] [Date]    
          ex> 04pm March 17
        也是一样,强制在某年某月某日的某时刻进行!
      HH:MM[am|pm] + number [minutes|hours|days|weeks]
        ex> now + 5 minutes    
        ex> 04pm + 3 days
        就是说,在某个时间点『再加几个时间后』才进行。
    
    范例一:再过五分钟后,将 /root/.bashrc 寄给 root 自己
    [root@www ~]# at now + 5 minutes  <==记得单位要加 s 喔!
    at> /bin/mail root -s "testing at job" < /root/.bashrc
    at> <EOT>   <==这里输入 [ctrl] + d 就会出现 <EOF> 的字样!代表结束!
    job 4 at 2009-03-14 15:38
    # 上面这行资讯在说明,第 4 个 at 工作将在 2009/03/14 的 15:38 进行!
    # 而运行 at 会进入所谓的 at shell 环境,让你下达多重命令等待运行!
    
    范例二:将上述的第 4 项工作内容列出来查阅
    [root@www ~]# at -c 4
    #!/bin/sh               <==就是透过 bash shell 的啦!
    # atrun uid=0 gid=0
    # mail     root 0
    umask 22
    ....(中间省略许多的环境变量项目)....
    cd /root || {           <==可以看出,会到下达 at 时的工作目录去运行命令
             echo 'Execution directory inaccessible' >&2
             exit 1
    }
    
    /bin/mail root -s "testing at job" < /root/.bashrc
    # 你可以看到命令运行的目录 (/root),还有多个环境变量与实际的命令内容啦!
    
    范例三:由於机房预计於 2009/03/18 停电,我想要在 2009/03/17 23:00 关机?
    [root@www ~]# at 23:00 2009-03-17
    at> /bin/sync
    at> /bin/sync
    at> /sbin/shutdown -h now
    at> <EOT>
    job 5 at 2009-03-17 23:00
    # 您瞧瞧! at 还可以在一个工作内输入多个命令呢!不错吧!
    

    当我们使用 at 时会进入一个 at shell 的环境来让使用者下达工作命令,此时,建议你最好使用绝对路径来下达你的命令

    at 的执行与终端机环境无关,而所有 standard output/standard error output 都 会传送到执行者的 mailbox 去

    假如你在 tty1 登陆,则可以使用“ echo "Hello" > /dev/tty1 ”来取 代

    如果在 at shell 内的指令并没有任何的讯息输出,那么 at 默认不会发 email 给执行者的。 如果你想要让 at 无论如何都发一封 email 告知你是否执行了指令,那么 可以使用“ at -m 时间格式 ”来下达指令

    at 有另外一个很棒的优点,那就是“背景执行”

    系统会将该项 at 工作独立出你的 bash 环境中, 直接交给系统的 atd 程序来接管

    at 工作的管理

    可以利用 atq 来查询,利用 atrm 来删除错误的指令,利用 at 来直接下达单一工 作调度

    [root@www ~]# atq
    [root@www ~]# atrm (jobnumber)
    
    范例一:查询目前主机上面有多少的 at 工作排程?
    [root@www ~]# atq
    5       2009-03-17 23:00 a root
    # 上面说的是:『在 2009/03/17 的 23:00 有一项工作,该项工作命令下达者为 
    # root』而且,该项工作的工作号码 (jobnumber) 为 5 号喔!
    
    范例二:将上述的第 5 个工作移除!
    [root@www ~]# atrm 5
    [root@www ~]# atq
    # 没有任何资讯,表示该工作被移除了!
    

    batch:系统有空时才进行背景任务

    batch 是利用 at 来进行指令的下达啦!只是加入一些控制参数

    batch 神奇的 地方在于:他会在 CPU 的工作负载小于 0.8 的时候,才进行你所下达的工作任务

    工作负载的意思是: CPU 在单一时间点所负责的工作数量。不是CPU 的使用率喔! 举例来说,如果我有一只程序他需要一直使用 CPU 的运算功能,那么此 时 CPU 的使用率可能到达 100% , 但是 CPU 的工作负载则是趋近于“ 1 ”,因为 CPU 仅负 责一个工作嘛!如果同时执行这样的程序两支呢? CPU 的使用率还是 100% ,但是工作负载 则变成 2 了!

    所以也就是说,当 CPU 的工作负载越大,代表 CPU 必须要在不同的工作之间进行频繁的工 作切换。

    为了产生 CPU 较高的工作负 载,因此我们用了 12 章里面计算 pi 的脚本,连续执行 4 次这只程序, 来仿真高负载,然后 来玩一玩 batch 的工作现象:

    范例一:请执行 pi 的计算,然后在系统闲置时,执行 updatdb 的任务 
    [root@study ~]# echo "scale=100000; 4*a(1)" | bc -lq & 
    [root@study ~]# echo "scale=100000; 4*a(1)" | bc -lq & 
    [root@study ~]# echo "scale=100000; 4*a(1)" | bc -lq & 
    [root@study ~]# echo "scale=100000; 4*a(1)" | bc -lq & 
    
    # 然后等待个大约数十秒的时间,之后再来确认一下工作负载的情况! 
    [root@study ~]# uptime 
    19:56:45 up 2 days, 19:54, 2 users, load average: 3.93, 2.23, 0.96 
    
    [root@study ~]# batch 
    at> /usr/bin/updatedb 
    at> <EOT> 
    job 4 at Thu Jul 30 19:57:00 2015 
    
    [root@study ~]# date;atq 
    Thu Jul 30 19:57:47 CST 2015 
    4   Thu Jul 30 19:57:00 2015 b root 
    # 可以看得到,明明时间已经超过了,却没有实际执行 at 的任务! 
    
    [root@study ~]# jobs
     [1] Running echo "scale=100000; 4*a(1)" | bc -lq &
     [2] Running echo "scale=100000; 4*a(1)" | bc -lq &
     [3]- Running echo "scale=100000; 4*a(1)" | bc -lq &
     [4]+ Running echo "scale=100000; 4*a(1)" | bc -lq & 
    [root@study ~]# kill -9 %1 %2 %3 %4 
    # 这时先用 jobs 找出背景工作,再使用 kill 删除掉四个背景工作后,慢慢等待工作负载的下降 
    
    [root@study ~]# uptime; atq 
    20:01:33 up 2 days, 19:59, 2 users, load average: 0.89, 2.29, 1.40 
    4       Thu Jul 30 19:57:00 2015 b root 
    [root@study ~]# uptime; atq 
    20:02:52 up 2 days, 20:01, 2 users, load average: 0.23, 1.75, 1.28 
    # 在 19:59 时,由于 loading 还是高于 0.8,因此 atq 可以看得到 at job 还是持续再等待当中喔! 
    # 但是到了 20:01 时, loading 降低到 0.8 以下了,所以 atq 就执行完毕啰!
    

    使用 uptime 可以观察到 1, 5, 15 分钟的“平均工作负载”量,因为是平均值,所以当我们如上 表删除掉四个工作后,工作负载不会立即降低, 需要一小段时间让这个 1 分钟平均值慢慢回 复到接近 0 啊!当小于 0.8 之后的“整分钟时间”时,atd 就会将 batch 的工作执行掉了!

    什么是“整分钟时间”呢?不论是 at 还是下面要介绍的 crontab,他们最小的时间单位是“分 钟”,所以,基本上,他们的工作是“每分钟检查一次”来处理的! 就是整分

    batch 也是使用 atq/atrm 来管理的

    15.3 循环执行的例行性工作调度

    cron (crond) 这个系统 服务是默认启动的

    15.3.1 使用者的设置

    可以限制使用 crontab 的使用者帐号

    • /etc/cron.allow: 将可以使用 crontab 的帐号写入其中,若不在这个文件内的使用者则不 可使用 crontab;

    • /etc/cron.deny: 将不可以使用 crontab 的帐号写入其中,若未记录到这个文件当中的使 用者,就可以使用 crontab 。

    以优先顺序来说, /etc/cron.allow 比 /etc/cron.deny 要优先

    当使用者使用 crontab 这个指令来创建工作调度之后,该项工作就会被纪录到 /var/spool/cron/ 里面去了,而且是以帐号来作为判别的喔!举例来说, dmtsai 使用 crontab 后, 他的工作会被纪录到 /var/spool/cron/dmtsai 里头去

    cron 执行的每一项工 作都会被纪录到 /var/log/cron 这个登录文件中

    [root@www ~]# crontab [-u username] [-l|-e|-r]
    选项与参数:
    -u  :只有 root 才能进行这个任务,亦即帮其他使用者创建/移除 crontab 工作排程;
    -e  :编辑 crontab 的工作内容
    -l  :查阅 crontab 的工作内容
    -r  :移除所有的 crontab 的工作内容,若仅要移除一项,请用 -e 去编辑。
    
    范例一:用 dmtsai 的身份在每天的 12:00 发信给自己
    [dmtsai@www ~]$ crontab -e
    # 此时会进入 vi 的编辑画面让您编辑工作!注意到,每项工作都是一行。
    0   12  *  *  *  mail dmtsai -s "at 12:00" < /home/dmtsai/.bashrc
    #分 时  日  月 周 |<==============命令串========================>|
    

    直接下达“ crontab -e ”去编辑自己的例行性命令了,会进入 vi 的编辑画面, 然后 以一个工作一行来编辑

    每项工作 (每 行) 的格式都是具有六个字段,这六个字段的意义为:

    代表意义 分钟 小时 日期 月份 命令
    数字范围 0-59 0-23 1-31 1-12 0-7 命令

    周的数字为 0 或 7 时,都代表“星期天”的意思

    特殊字符 代表意义
    *(星号) 代表任何时刻都接受的意思!举例来说,范例一内那个日、月、周都是 * , 就代表著『不论何月、何日的礼拜几的 12:00 都运行后续命令』的意思!
    ,(逗号) 代表分隔时段的意思。举例来说,如果要下达的工作是 3:00 与 6:00 时,就会是:

    > 0 3,6 * * * command

    时间参数还是有五栏,不过第二栏是 3,6 ,代表 3 与 6 都适用!
    -(减号) 代表一段时间范围内,举例来说, 8 点到 12 点之间的每小时的 20 分都进行一项工作:

    > 20 8-12 * * * command

    仔细看到第二栏变成 8-12 喔!代表 8,9,10,11,12 都适用的意思!
    /n(斜线) 那个 n 代表数字,亦即是『每隔 n 单位间隔』的意思,例如每五分钟进行一次,则:


    > */5 * * * * command

    很简单吧!用 * 与 /5 来搭配,也可以写成 0-59/5 ,相同意思!
    # 例题:要在 5 月 1 日的 23:59 发一封信
    59 23 1 5 * mail kiki < /home/dmtsai/lover.txt
    
    # 每五分钟需要执行 /home/dmtsai/test.sh 一次
    */5 * * * * /home/dmtsai/test.sh
    
    # 每个星期五下午 4:30 告诉你朋友星期六的约 会不要忘记
    30 16 * * 5 mail friend@his.server.name < /home/dmtsai/friend.txt
    
    # 查询使用者目前的 crontab 内容
    [dmtsai@www ~]$ crontab -l
    59 23 1 5 * mail kiki < /home/dmtsai/lover.txt
    */5 * * * * /home/dmtsai/test.sh
    30 16 * * 5 mail friend@his.server.name < /home/dmtsai/friend.txt
    
    # 注意,若仅想要移除一项工作而已的话,必须要用 crontab -e 去编辑~
    # 如果想要全部的工作都移除,才使用 crontab -r 喔!
    [dmtsai@www ~]$ crontab -r
    

    15.3.2 系统的配置文件: /etc/crontab, /etc/cron.d/*

    “ crontab -e ”是针对使用者的 cron 来设计的,如果是“系统的例行性任务”时,只要编辑 /etc/crontab 这个文件就可以

    cron 这个服务的最低侦测限制是“分钟”,所以“ cron 会每分钟去读取一次 /etc/crontab 与 /var/spool/cron 里面的数据内容 ”,因此,只要你编辑完 /etc/crontab 这个文 件,并且将他储存之后,那么 cron 的设置就自动的会来执行了

    在 Linux 下面的 crontab 会自动的帮我们每分钟重新读取一次 /etc/crontab 的例行工作事 项,但是某些原因或者是其他的 Unix 系统中,由于 crontab 是读到内存当中的,所以在你修 改完 /etc/crontab 之后,可能并不会马上执行, 这个时候请重新启动 crond 这个服务 吧!systemctl restart crond

    [root@VM-72-146-centos ~]# 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
    
    • MAILTO=root:当 /etc/crontab 这个文件中的例行性工作的指令发生错误时,或者是该工作的 执行结果有 STDOUT/STDERR 时,会将错误讯息或者是屏幕显示的讯息传给谁?

    • PATH=....:可执行文件的搜寻路径

    • “分 时 日 月 周 身份 指令”七个字段的设置:分、时、 日、月、周五个字段, 但是在五个字段后面接的并不是指令,而是一个新的字段,那就是“执 行后面那串指令的身份”为何!这与使用者的 crontab -e 不相同,系统默认的 例行性工作是以 root 的身份来进行的。

    crond 服务读取配置文件的位置

    • /etc/crontab

    • /etc/cron.d/*

    • /var/spool/cron/*

    跟系统的运行比较有关系的两个配置文件是放在 /etc/crontab 文件内以及 /etc/cron.d/* 目录内的文件, 另外一个是跟用户自己的工作比较有关的配置文件,就是放在 /var/spool/cron/ 里面的文件群

    [root@VM-72-146-centos ~]# ll /etc/cron.d
    total 12
    -rw-r--r-- 1 root root 128 Nov  8  2019 0hourly
    -rw-r--r-- 1 root root 108 Sep 30  2020 raid-check
    -rw------- 1 root root 235 Nov 11  2019 sysstat
    
    [root@VM-72-146-centos ~]# ll /etc/cron* -d
    drwxr-xr-x 2 root root 4096 Jul 29  2021 /etc/cron.d
    drwxr-xr-x 2 root root 4096 Aug 11 16:39 /etc/cron.daily
    -rw------- 1 root root    0 Nov  8  2019 /etc/cron.deny
    drwxr-xr-x 2 root root 4096 Jul 29  2021 /etc/cron.hourly
    drwxr-xr-x 2 root root 4096 Jun 10  2014 /etc/cron.monthly
    -rw-r--r-- 1 root root  451 Jun 10  2014 /etc/crontab
    drwxr-xr-x 2 root root 4096 Jun 10  2014 /etc/cron.weekly
    
    [root@VM-72-146-centos ~]# cat /etc/cron.d/0hourly 
    # Run the hourly jobs
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    01 * * * * root run-parts /etc/cron.hourly
    # 每个整点的一分会执行“ run-parts /etc/cron.hourly ”这个指令
    

    run-parts 脚本会在大约 5 分钟内随机选一个时间来执行 /etc/cron.hourly 目录内的所有可执行文件!因此,放在 /etc/cron.hourly/ 的文件,必须是能被 直接执行的指令脚本, 而不是分、时、日、月、周的设置值

    也就是说,除了自己指定分、时、日、月、周加上指令路径的 crond 配置文件之外,你也可 以直接将指令放置到(或链接到)/etc/cron.hourly/ 目录下, 则该指令就会被 crond 在每小时 的 1 分开始后的 5 分钟内,随机取一个时间点来执行啰!

    除了可以直接将指令放到 /etc/cron.hourly/ 让系统每小时定时 执行之外,在 /etc/ 下面其实还有 /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/,那三 个目录是代表每日、每周、每月各执行一次

    跟 /etc/cron.hourly/ 不太一样的是,那三个目录是由 anacron 所执行的,而 anacron 的 执行方式则是放在 /etc/cron.hourly/0anacron 里面

    总结一下吧:

    • 个人化的行为使用“ crontab -e ”:如果你是依据个人需求来创建的例行工作调度,建议直 接使用 crontab -e 来创建你的工作调度较佳! 这样也能保障你的指令行为不会被大家看 到 (/etc/crontab 是大家都能读取的权限喔!);

    • 系统维护管理使用“ vim /etc/crontab ”:如果你这个例行工作调度是系统的重要工作,为 了让自己管理方便,同时容易追踪,建议直接写入 /etc/crontab 较佳!

    • 自己开发软件使用“ vim /etc/cron.d/newfile ”:如果你是想要自己开发软件,那当然最好 就是使用全新的配置文件,并且放置于 /etc/cron.d/ 目录内即可。

    • 固定每小时、每日、每周、每天执行的特别工作:如果与系统维护有关,还是建议放置 到 /etc/crontab 中来集中管理较好。 如果想要偷懒,或者是一定要再某个周期内进行的 任务,也可以放置到上面谈到的几个目录中,直接写入指令即可!

    15.3.3 一些注意事项

    • 资源分配不均的问题

      • 如果每个流程都在同一个时间启动的话,那么在某个时段时,我的系统会变的相当的繁忙
    • 取消不要的输出项目

      • 直接以“数据流重导向”将输出的结果输出到 /dev/null
    • 安全的检验

      • 借由检查 /var/log/cron 的内容 来视察是否有“非您设置的 cron 被执行了
    • 周与日月不可同时并存

      • 可以分别以周或者是日月为单位作为循环,但你不可使用 「几月几号且为星期几」的模式工作

    15.4 可唤醒停机期间的工作任务

    15.4.1 什么是 anacron

    anacron 并不是用来取代 crontab 的,anacron 存在的目的就在于处理非 24 小时一直启动的 Linux 系统的 crontab 的执行! 以及因为某些原因导致的超过时间而没有 被执行的调度工作。

    anacron 也是每个小时被 crond 执行一次,然后 anacron 再去检测相关的调度任务有没 有被执行,如果有超过期限的工作在, 就执行该调度任务,执行完毕或无须执行任何调度 时,anacron 就停止了。

    anacron 默认会以一天、七天、一个月为期去侦测系统未进行的 crontab 任务

    那么 anacron 又是怎么知道我们的系统啥时关机的呢?这就得要使用 anacron 读取的时间记 录文件 (timestamps) 了! anacron 会去分析现在的时间与时间记录文件所记载的上次执行 anacron 的时间,两者比较后若发现有差异, 那就是在某些时刻没有进行 crontab 啰!此时 anacron 就会开始执行未进行的 crontab 任务了!

    15.4.2 anacron 与 /etc/anacrontab

    anacron 其实是一支程序并非一个服务!这支程序在 CentOS 当中已经进入 crontab 的调度 喔!同时 anacron 会每个小时被主动执行一次喔

    anacron 的配置文件 应该放置在 /etc/cron.hourly/0anacron

    [root@www ~]# anacron [-sfn] [job]..
    [root@www ~]# anacron -u [job]..
    选项与参数:
    -s  :开始一连续的运行各项工作 (job),会依据时间记录档的数据判断是否进行;
    -f  :强制进行,而不去判断时间记录档的时间戳记;
    -n  :立刻进行未进行的任务,而不延迟 (delay) 等待时间;
    -u  :仅升级时间记录档的时间戳记,不进行任何工作。
    job :由 /etc/anacrontab 定义的各项工作名称。
    

    CentOS 中,anacron 的进行其实是在每个小时都会被抓出来执行一次, 但是为了 担心 anacron 误判时间参数,因此 /etc/cron.hourly/ 里面的 anacron 才会在文件名之前加个 0 (0anacron),让 anacron 最先进行!就是为了让时间戳记先更新!以避免 anacron 误判 crontab 尚未进行任何工作的意思。

    [root@VM-72-146-centos ~]# cat /etc/anacrontab 
    SHELL=/bin/sh
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    RANDOM_DELAY=45            # 随机给予最大延迟时间,单位是分钟
    START_HOURS_RANGE=3-22        # 延迟多少个小时内应该要执行的任务时间
    
    #period in days   delay in minutes   job-identifier   command
    1       5       cron.daily              nice run-parts /etc/cron.daily
    7       25      cron.weekly             nice run-parts /etc/cron.weekly
    @monthly 45     cron.monthly            nice run-parts /etc/cron.monthly
    # 天数   延迟时间   工作名称定义             实际要进行的指令串
    
    • 天数:anacron 执行当下与时间戳记 (/var/spool/anacron/ 内的时间纪录档) 相差的天 数,若超过此天数,就准备开始执行,若没有超过此天数,则不予执行后续的指令。

    • 延迟时间:若确定超过天数导致要执行调度工作了,那么请延迟执行的时间,因为担心 立即启动会有其他资源冲突的问题吧!

    • 工作名称定义:这个没啥意义,就只是会在 /var/log/cron 里头记载该项任务的名称这 样!通常与后续的目录资源名称相同即可。

    • 实际要进行的指令串:有没有跟 0hourly 很像啊!没错!相同的作法啊!通过 run-parts 来处理的!

    anacron 的执行流程应该是这样的 (以 cron.daily 为例):

    1. 由 /etc/anacrontab 分析到 cron.daily 这项工作名称的天数为 1 天;

    2. 由 /var/spool/anacron/cron.daily 取出最近一次执行 anacron 的时间戳记;

    3. 由上个步骤与目前的时间比较,若差异天数为 1 天以上 (含 1 天),就准备进行指令;

    4. 若准备进行指令,根据 /etc/anacrontab 的设置,将延迟 5 分钟 + 3 小时 (看 START_HOURS_RANGE 的设置);

    5. 延迟时间过后,开始执行后续指令,亦即“ run-parts /etc/cron.daily ”这串指令;

    6. 执行完毕后,anacron 程序结束。

    总结一下本章谈到的许多配置文件与目录的关系吧!这样我们才能了解 crond 与 anacron 的关系:

    1. crond 会主动去读取 /etc/crontab, /var/spool/cron/, /etc/cron.d/ 等配置文件,并依据“分、时、日、月、周”的时间设置去各项工作调度;

    2. 根据 /etc/cron.d/0hourly 的设置,主动去 /etc/cron.hourly/ 目录下,执行所有在该目录下的可执行文件;

    3. 因为 /etc/cron.hourly/0anacron 这个指令档的缘故,主动的每小时执行 anacron ,并调用 /etc/anacrontab 的配置文件;

    4. 根据 /etc/anacrontab 的设置,依据每天、每周、每月去分析 /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/ 内的可执行文件,以进行固定周期需要执行的指令。

    crontab 与 at 都是“定时”去执行,过了时间就过了!不会重新来一遍~那 anacron 则是“定期”去执行,某一段周期的执行~ 因此,两者可以并行,并不会互相冲突啦!

  • 相关阅读:
    Android之旅十六 android中各种资源的使用
    XTU OJ 1207 Welcome to XTCPC (字符串签到题)
    scala并发编程原生线程Actor、Case Class下的消息传递和偏函数实战
    【云图】怎样设置支付宝里的家乐福全国连锁店地图?
    怎样在QML中使用multitouch
    软件project师周兆熊给IT学子的倾情奉献
    Linux系统下怎样配置SSH?怎样开启SSH?
    数学之路-python计算实战(4)-Lempel-Ziv压缩(2)
    Day5上午解题报告
    一份只有巨佬才能看懂的代码
  • 原文地址:https://www.cnblogs.com/huangwenjie/p/16870706.html
Copyright © 2020-2023  润新知