例行性工作排程(crontab)

两种工作排程的方式:

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

仅执行一次的工作排程

atd 的启动

at 是个可以处理仅执行一次就结束排程的指令,不过要执行 at 时, 必须要有 atd 这个服务:

[root@centos764 ~]# systemctl restart atd    # 重新启动 atd 这个服务
[root@centos764 ~]# systemctl enable atd     # 让这个服务开机就自动启动 
[root@centos764 ~]# systemctl status atd     # 查阅一下 atd 目前的状态 
● atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
   Active: active (running) since 日 2018-09-23 17:59:09 CST; 18s ago
 Main PID: 6000 (atd)
   CGroup: /system.slice/atd.service
           └─6000 /usr/sbin/atd -f

9月 23 17:59:09 centos764 systemd[1]: Started Job spooling tools.
9月 23 17:59:09 centos764 systemd[1]: Starting Job spooling tools...

at 运作的方式

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

可以使用 /etc/at.allow 和 /etc/at.deny 这两个文件来进行对 at 进行限制,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 这个指令

一般没有 /etc/at.allow 文件,只有一个空白的 /etc/at.deny 文件,如果想添加用户,将那个使用者的账号写入 /etc/at.deny,一个账号写一行。

at 命令的用法

at 加上一个时间即可,如下:

[root@study ~]# at [-mldv] TIME 
[root@study ~]# 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 2015-07-30  
       强制规定在某年某月的某一天的特殊时刻进行该工作!   
  HH:MM[am|pm] [Month] [Date] ex: 04pm July 30  
       也是一样,强制在某年某月某日的某时刻进行!   
  HH:MM[am|pm] + number [minutes|hours|days|weeks] 
       ex> now + 5 minutes ex: 04pm + 3 days  
       就是说,在某个时间点『再加几个时间后』才进行。 

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

[root@study ~]# at now + 5 minutes  <==记得单位要加 s 喔! 
at> /bin/mail -s "testing at job" root < /root/.bashrc 
at> <EOT>   <==这里输入 [ctrl] + d 就会出现 <EOF> 的字样,代表结束! 
job 2 at Thu Jul 30 19:35:00 2015 
# 上面这行信息在说明,第 2 个 at 工作将在 2015/07/30 的 19:35 进行! 
# 而执行 at 会进入所谓的 at shell 环境,让你下达多重指令等待运作! 

使用 at 时会进入一个 at shell 的环境来让用户下达工作指令,此时,最好使 用绝对路径来下达你的指令,比较不会有问题。由于 at 工作排程的使用上,系统会将该项 at 工作独立出你的 bash 环境中, 直接交给系统的 atd 程序来接管,因此,当你下达了 at 的工作之后就可以立刻脱机了, 剩下的工作就完全交给 Linux 管理即可。

at 工作的管理

利用 atqatrm 删除 at 工作。用法如下:

[root@study ~]# atq    # 查询目前主机上面所有的 at 工作排程
[root@study ~]# atrm jobnumber  # 删除工作号码 为 jobnumber 的工作排程

循环执行的例行性工作排程

循环执行的例行性工作排程则是由 cron (crond) 这个系统服务来控制的,这个服务是默认启动的。

使用者的设定

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

以优先级来说, /etc/cron.allow 比 /etc/cron.deny 要优先, 而判断上面,这 两个文件只选择一个来限制而已,因此,建议只要保留一个即可,系统默认保存 /etc/cron.deny。 用户使用 crontab 这个指令来建立工作排程之后,该项工作就会被纪录到 /var/spool/cron/ 里面去 了,而且是以账号来作为判定。举例来说, dmtsai 使用 crontab 后, 他的工作会被纪录到 /var/spool/cron/dmtsai 里头去。但请注意,不要使用 vi 直接编辑该文件, 因为可能由于输入语法错误,会导致无法执行cron 。另外, cron 执行的每一项工作都会被纪录到 /var/log/cron 这个登录 档中,所以啰,如果你的 Linux 不知道有否被植入木马时,也可以搜寻一下 /var/log/cron 这个登录档。

crontab 命令用法:

[root@study ~]# crontab [-u username] [-l|-e|-r] 
选项与参数: 
-u  :只有 root 才能进行这个任务,亦即帮其他使用者建立/移除 crontab 工作排程; 
-e  :编辑 crontab 的工作内容 
-l  :查阅 crontab 的工作内容 
-r  :移除所有的 crontab 的工作内容,若仅要移除一项,请用 -e 去编辑。 

范例:用 admin 的身份在每天的 12:00 发信给自己:

[dmtsai@study ~]$ crontab -e 
# 此时会进入 vi 的编辑画面让您编辑工作!注意到,每项工作都是一行。
0   12  *  *  * mail -s "at 12:00" dmtsai < /home/dmtsai/.bashrc 
#分 时 日 月 周 |<==============指令串========================>| 

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

crontab -e 命令时针对使用者来设计的,如果是系统的例行性任务,只需要编写 /etc/crontab 这个文件。cron 这个服务的最低侦测限制是『分钟』,所以『 cron 会每分钟去读取一次 /etc/crontab 与 /var/spool/cron 里面的数据内容 』,因此,只要你编辑完 /etc/crontab 这个文件,并且将他储存之后, 那么 cron 的设定就自动的会来执行了。如果没有马上执行,重新启动 crond 这个服务 systemctl restart crond 即可。

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

一般来说,crond 预设有三个地方会有执行脚本配置文件:

  • /etc/crontab
  • /etc/cron.d/*
  • /var/spool/cron/*

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

[root@centos764 ~]# ll /etc/cron.d/
总用量 12
-rw-r--r--. 1 root root 128 4月  11 09:48 0hourly
-rw-r--r--. 1 root root 108 4月  11 04:33 raid-check
-rw-------. 1 root root 235 4月  11 11:33 sysstat
[root@centos764 ~]# 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 是 shell script, run-parts 脚本会在大约 5 分钟内随机选一个时间来执行 /etc/cron.hourly 目录内的所有执行文件!因 此,放在 /etc/cron.hourly/ 的文件,必须是能被直接执行的指令脚本, 而不是分、时、日、月、周 的设定值。

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

anacron 处理因为某些原因导致的超过时间而没有被执行的排程工作。anacron 也是每个小时被 crond 执行一次,然后 anacron 再去检测相关的排程任务有没有被执行,如果有超过期限的工作在, 就执行该排程任务,执行完毕或无须执行任何排程时,anacron 就停止。

anacron 其实是一支程序并非一个服务,这支程序会每个小时被主动执行一次, anacron 的配置文件放置在 /etc/cron.hourly,如下:

[root@centos764 ~]# cat /etc/cron.hourly/0anacron | grep anacron
# Check whether 0anacron was run today already
if test -r /var/spool/anacron/cron.daily; then
    day=`cat /var/spool/anacron/cron.daily`
/usr/sbin/anacron -s

anacron 命令用法如下:

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

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 程序结束。

隔了一阵子才将 CentOS 开机,开机过后约 1 小时左 右系统会有一小段时间的忙碌,而且硬盘会跑个不停,那就是因为 anacron 正在执行过去 /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/ 里头的未进行的各项工作排程。




发表评论

评论列表,共 0 条评论

    暂无评论