例行性工作排程(crontab)
例行性工作排程(crontab)
仅执行一次的工作排程
atd启动
[root@study ~]# systemctl restart atd # 重新启动 atd 这个服务
[root@study ~]# systemctl enable atd # 让这个服务开机就自动启动
[root@study ~]# systemctl status atd # 查阅一下 atd 目前的状态
at 的运作方式
- 先找寻 /etc/at.allow 这个文件,写在这个文件中的使用者才能使用 at ,没有在这个文件中的使用者则不能使用 at (即使没有写在 at.deny 当中);
- 如果 /etc/at.allow 不存在,就寻找 /etc/at.deny 这个文件,若写在这个 at.deny 的使用者则不能使用 at ,而没有在这个 at.deny 文件中的使用者,就可以使用 at 咯;
- 如果两个文件都不存在,那么只有 root 可以使用 at 这个指令。
at 单一工作排程的进行
- at [-mldv] TIME
- 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
就是说,在某个时间点『再加几个时间后』才进行。
- HH:MM ex> 04:00
at 工作的管理
- atq:查询目前主机上面有多少的 at 工作排程。
- atrm 工作号码:移除工作排程。
循环执行的例行性工作排程
循环执行的例行性工作排程则是由 cron (crond) 这个系统服务来控制的。当用户使用 crontab 这个指令来建立工作排程之后,该项工作就会被纪录到 /var/spool/cron/ 里面去了,而且是以账号来作为判别的。不要使用 vi 直接编辑该文件, 因为可能由于输入语法错误,会导致无法执行 cron。
- crontab [-u username] [-l|-e|-r]
- 选项与参数:
- -u :只有 root 才能进行这个任务,亦即帮其他使用者建立/移除 crontab 工作排程;
- -e :编辑 crontab 的工作内容
- -l :查阅 crontab 的工作内容
- -r :移除所有的 crontab 的工作内容,若仅要移除一项,请用 -e 去编辑。
系统的配置文件: /etc/crontab, /etc/cron.d/*
- 个人化的行为使用『 crontab -e 』:如果你是依据个人需求来建立的例行工作排程,建议直接使用 crontab -e来建立你的工作排程较佳! 这样也能保障你的指令行为不会被大家看到 (/etc/crontab 是大家都能读取的权
限喔!); - 系统维护管理使用『 vim /etc/crontab 』:如果你这个例行工作排程是系统的重要工作,为了让自己管理方便,同时容易追踪,建议直接写入 /etc/crontab 较佳!
- 自己开发软件使用『 vim /etc/cron.d/newfile 』:如果你是想要自己开发软件,那当然最好就是使用全新的配置文件,并且放置于 /etc/cron.d/ 目录内即可。
- 固定每小时、每日、每周、每天执行的特别工作:如果与系统维护有关,还是建议放置到 /etc/crontab 中来集中管理较好。 如果想要偷懒,或者是一定要再某个周期内进行的任务,也可以放置到上面谈到的几个目录中,直接写入指令即可!
可唤醒停机期间的工作任务
- anacron [-sfn] [job]..
- anacron -u [job]..
- 选项与参数:
- -s :开始一连续的执行各项工作 (job),会依据时间记录文件的数据判断是否进行;
- -f :强制进行,而不去判断时间记录文件的时间戳;
- -n :立刻进行未进行的任务,而不延迟 (delay) 等待时间;
- -u :仅更新时间记录文件的时间戳,不进行任何工作。
- job :由 /etc/anacrontab 定义的各项工作名称。
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 程序结束。
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/内的执行文件,以进行固定周期需要执行的指令。
重点回顾
- 系统可以透过 at 这个指令来排程单一工作的任务!『at TIME』为指令下达的方法,当 at 进入排程后, 系统执行该排程工作时,会到下达时的目录进行任务;
- at 的执行必须要有 atd 服务的支持,且 /etc/at.deny 为控制是否能够执行的使用者账号;
- 透过 atq, atrm 可以查询与删除 at 的工作排程;
- batch 与 at 相同,不过 batch 可在 CPU 工作负载小于 0.8 时才进行后续的工作排程;
- 系统的循环例行性工作排程使用 crond 这个服务,同时利用 crontab -e 及 /etc/crontab 进行排程的安排;
- crontab -e 设定项目分为六栏,『分、时、日、月、周、指令』为其设定依据;
- /etc/crontab 设定分为七栏,『分、时、日、月、周、执行者、指令』为其设定依据;
- anacron 配合 /etc/anacrontab 的设定,可以唤醒停机期间系统未进行的 crontab 任务!