本章架构: 1.什么是例行性工作调度 2.仅执行一次的工作调度 3.循环执行的例行性工作调度 4.可唤醒停机期间的工作任务

一、什么是例行性工作调度

两种工作调度的方式:

  • 一种是例行性的,就是每隔一定的周期要来办的事项
  • 一种是突发性的,就是这次做完以后就没有的哪一种

1.在Linux下面如何达到这两个功能呢

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

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

2.Linux系统常见的例行性任务

二、执行一次的工作调度

1.调度服务at指令

at 的工作情况:

  • 先找寻 /etc/at.allow 这个文件,写在这个文件中的使用者才能使用 at ,没有在这个文件中的使用者则不能使用 at (即使没有写在 at.deny 当中);
  • 如果 /etc/at.allow 不存在,就寻找 /etc/at.deny 这个文件,若写在这个 at.deny 的使用者则不能使用 at ,而没有在这个 at.deny 文件中的使用者,就可以使用 at 咯;
  • 如果两个文件都不存在,那么只有 root 可以使用 at 这个指令。

2.at选项与参数

首先来看如何设置一次性任务,命令格式为:at [HH:MM] [yyyy-mm-dd];

查看一次性任务计划的命令为:“ atq ”

删除一次性任务计划的命令格式为:“ atrm [任务编号]”

范例:再过五分钟后,将 /root/ .bashrc寄给 root 自己

三、循环执行的例行性工作调度

1.crontab 使用的限制数据有:

  • /etc/cron.allow: 将可以使用 crontab 的帐号写入其中,若不在这个文件内的使用者则不可使用 crontab;
  • /etc/cron.deny: 将不可以使用 crontab 的帐号写入其中,若未记录到这个文件当中的使用者,就可以使用 crontab 。
  • 以优先顺序来说, /etc/cron.allow 比 /etc/cron.deny 要优先, 而判断上面,这两个文件只选择一个 来限制而已,因此,建议你只要保留一个即可, 免得影响自己在设置上面的判断!一般来说,系统默认是保留 /etc/cron.deny , 你 可以将不想让他执行 crontab 的那个使用者写入 /etc/cron.deny 当中,一个帐号一行!

2.crontab选项与参数:

  其中 -u user为 编辑某个用户的cron,只用root可以使用此参数为别的用户设置cron服务。也可用于给用户指定crontab文件

范例 实例1:列出当前用户的定时任务

[22:30:17][dodmaster@mha3 ~]$ crontab -l
0 1 * * 1 $HOME/.DailyShell/hislogclear.sh 
0 * * * * $HOME/.DailyShell/mvcdr2bak.sh $HOME/data/message/voice
20 * * * * $HOME/.DailyShell/mvcdr2bak.sh $HOME/data/message/data/
40 * * * * $HOME/.DailyShell/mvcdr2bak.sh $HOME/data/message/sms/

实例2:root用户编辑用户martin的定时任务


[22:30:17][root@mha3 ~]# crontab -u martin -e

实例3:为用户martin指定定时任务文件

[22:30:17][root@mha3 ~]# crontab -u martin martincron

以下内容说明了系统定时任务的具体书写格式:

实例1:每周末的凌晨一点钟执行一次系统的raid-check

0 1 * * Sun root /usr/sbin/raid-check

实例2:每天的4:02am分root用户执行/etc/cron.daily目录下的所有脚本,run-parts参数表示执行后面目录中的所有脚本。

02 4 * * * root run-parts /etc/cron.daily

实例3:每天的8-18每四小时,dodmaster用户执行hislogclear.sh脚本,即8:44,12:44,16:44,20:44四个时间点,会执行该脚本。

[21:57:56][dodmaster@mha3 ~]$ crontab -l
44 8-20/4 * * * $HOME/.DailyShell/hislogclear.sh 

实例4:每五分钟执行一次

*/5 * * * * echo "every five minute to do it" >> time.txt

  

实例5:每个工作日下午八点执行

0 20 * * 1-5 echo "every workday 20:00 to do it" >> time.txt

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

想像一个环境,你的 Linux 服务器有一个工作是需要在每周的星期天凌晨 2 点进行,但是很不巧的,星期六停电了~所以 你得要星期一才能进公司去启动服务器。 那么请问,这个星期天的工作调度还要不要进行? 因为你开机的时候已经是星期一,所以 星期天的工作当然不会被进行,对吧! 问题是,若是该工作非常重要 (例如例行备份), 所以其实你还是希望在下个星期天之前的某天还是进行一下比较好~ 那你该怎办?自己手动执行? 这时候就 得要靠 anacron 这个指令的功能了!这家伙可以主动帮你进行时间到了但却没有执行的调度喔!

**1.什么是 anacron **

  • anacron 并不是用来取代 crontab 的,anacron 存在的目的就在于我们上头提到的,在处理非 24 小时一直启动的 Linux 系 统的 crontab 的执行! 以及因为某些原因导致的超过时间而没有被执行的调度工作。
  • 其实 anacron 也是每个小时被 crond 执行一次,然后 anacron 再去检测相关的调度任务有没有被执行,如果有超过期限的 工作在, 就执行该调度任务,执行完毕或无须执行任何调度时,anacron 就停止了。

anacron参数选项:

2.anacron 的执行流程 (以 cron.daily 为例):

  • 由 /etc/anacrontab 分析到 cron.daily 这项工作名称的天数为 1 天;
  • 由 /var/spool/anacron/cron.daily 取出最近一次执行 anacron 的时间戳记;
  • 由上个步骤与目前的时间比较,若差异天数为 1 天以上 (含 1 天),就准备进行指令;
  • 若准备进行指令,根据 /etc/anacrontab 的设置,将延迟 5 分钟 + 3 小时 (看 START_HOURS_RANGE 的设置);
  • 延迟时间过后,开始执行后续指令,亦即“ run-parts /etc/cron.daily ”这串指令;
  • 执行完毕后, anacron 程序结束。

3.crond 与 anacron 的关系:

  • crond 会主动去读取 /etc/crontab, /var/spool/cron/, /etc/cron.d/ 等配置文件,并依据“分、时、日、月、周”的时间设置去各项工作调度;
  • 根据 /etc/cron.d/0hourly 的设置,主动去 /etc/cron.hourly/ 目录下,执行所有在该目录下的可执行文件;
  • 因为 /etc/cron.hourly/0anacron 这个指令档的缘故,主动的每小时执行 anacron ,并调用 /etc/anacrontab 的配置文件;
  • 根据 /etc/anacrontab 的设置,依据每天、每周、每月去分析 /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/ 内的可执行文 件,以进行固定周期需要执行的指令。

也就是说,如果你每个周日的需要执行的动作是放置于 /etc/crontab 的话,那么该动作只要过期了就过期了,并不会被抓 回来重新执行。但如果是放置在 /etc/cron.weekly/ 目录下,那么该工作就会定期,几乎一定会在一周内执行一次~如果你关机超过一 周,那么一开机后的数个小时内,该工作就会主动的被执行喔! 真的吗?因为 /etc/anacrontab 的定义啦! 注:基本上,crontab 与 at 都是“定时”去执行,过了时间就过了!不会重新来一遍~ 那 anacron 则是“定期”去执行,某一段周期的执行 ~ 因此,两者可以并行,并不会互相冲突啦!

———————— 本文至此结束,感谢阅读 ————————