【鸟哥 Linux 15】例行性工作排程(Linux定时任务)
【鸟哥 Linux 15】例行性工作排程(Linux定时任务)
定时任务的分类
-
例行性定时任务(循环间隔一定周期)。可通过
crontab来实现,依赖于crond服务。 -
突发性定时任务(只执行一次)。可通过
at来实现,依赖于atd服务。
Linux系统常见的例行性定时任务
-
log rotate: 登录数据的新旧交换
-
logwatch: 分析登录信息
-
updatedb: 更新locate的数据库
-
mandb: 更新man page数据库
-
更新RPM数据库(仅红帽系)
-
tmpwatch: 移除临时文件
-
网络服务相关行为分析
突发性定时任务(单次执行)
at命令和atd服务
- atd服务是负责突发性定时任务的服务,一般通过systemctl控制。
systemctl restart atd # 重启atd服务
systemctl enable atd # 设置为开机自启
systemctl status atd # 查看服务状态
-
将某个任务以文本文件的方式写入 /var/spool/at/ 目录内,atd就会在指定时间点自动调用这个任务。
-
编辑/etc/at.allow以及/etc/at.deny文件来控制使用at的权限。三种情况如下:
第一种情况:能找到at.allow文件,那么写在allow里面的用户均可以使用at(较为严格)
第二种情况:没有找到at.allow,但能找到at.deny文件,那么写在deny里面的用户不能使用at(较为松散)
第三种情况:两个文件都没有,那么就只有root用户可以使用at
-
at指令的使用:命令行只需要指定时间就可以进入交互模式(at shell环境),在交互模式下输入需要执行的指令(建议使用绝对路径来下达指令)即可,详细用法自行man page。
-
需要注意的是at指令的执行和tty无关,所有的标准输出和标准错误输出都会重定向到执行者的mailbox中,所以在at shell中仅使用
echo 'hello'是不会在指定时间点打印Hello的,需要显式重定向输出才行,就像这样echo 'hello' > /dev/tty1 -
当用户通过at shell下达了定时指令,该任务就独立于当前用户的bash环境了,直接交给系统atd服务来管理,有点类似nohup。
管理at工作
-
atq查询所有的at排程 -
atrm移除at排程 -
batch
例行性定时任务(例程,循环执行)
用户例行任务crontab基本使用
-
crontab指令来建立例行定时任务,建立的工作被放到/var/spool/cron中。 -
cron执行的每一项工作都会被记录到/var/log/cron中 -
和at类似,使用/etc/cron.allow和/etc/cron.deny来限制使用者账号
crontab -e # 当前用户编辑自己的crontable
- 以上命令通过vi编辑crontable,一行一个例程。每一个例程六个字段,指定分钟、小时、日期、月份、周、指令
- 辅助字符
| 字符 | 意义 |
|---|---|
| * | 不论何时 |
| , | 分隔多个时间 |
| - | 范围时间(几到几) |
| /n | 在时间范围内间隔多少执行一次(*/5 or 0-59/5) |
crontab -r # 删除当前用户所有crontable内容
- 如果只是想删一条,请用
crontab -e编辑
系统例行任务相关配置文件
- 管理系统的例行任务,并非使用crontab命令,而是需要编辑相关的配置文件。
配置文件/etc/crontab
-
crond服务的最低时间粒度为1min。
-
因此,crond服务每分钟读取/etc/crontab(系统例行任务)和/var/spool/cron(用户例行任务)中的内容
-
系统配置文件/etc/crontab比/var/spool/cron多了一些可用的设置(错误信息发送目标、执行指令搜索的PATH),同时配置服务的字段变成了七个:分钟、小时、日期、月份、周、身份、指令。多了一个身份字段,表明后面的指令是谁执行的,默认是root。
【*】crond服务会读取并执行哪些位置的配置?
-
/etc/crontab(*系统例程) -
/etc/cron.d/*(系统例程,内容和/etc/crontab几乎一样,配置自己开发的单个软件的例程) -
/var/spool/cron/*(*用户例程) -
/etc/cron.hourly:/etc/cron.d中存在0hourly例程,这个例程每个小时会执行/etc/cron.hourly中的所有脚本,所以也可以把需要每小时执行的脚本放在这里 -
/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly:这三个目录里面的脚本由anacron来执行,anacron被/etc/cron.hourly/0anacron调用,/etc/cron.hourly/0anacron被/etc/cron.d/0hourly调用,/etc/cron.d/0hourly由crond服务调用。
【*】使用crontab的一些小技巧
-
避免同一时间点同时执行大量的例程。可以通过
,来交错执行不同例程。 -
将不需要的输出内容重定向到黑洞/dev/null
-
使用
/var/log/cron来检查cron的执行,确保安全。 -
crontab使用的时候周和日月不能同时使用。
anacron: 关机期间的例程如何唤醒和执行?
anacron
-
当机器断电,crond就没办法通过crontab(run-parts)执行例程了。
-
和crontab不同,anacron用于处理个人电脑上的例程以及因为某些原因没有执行的例程的执行。
-
在cron.hourly中通过和
/var/spool/anacron中的时间记录文件中记录的时间戳的比对(具体逻辑可以查看/etc/cron.hourly/0anacron脚本),来判断一个例程是否已经被执行。 -
anacron是一个程序
/usr/sbin/anacron,默认配置于/etc/cron.hourly中,所以是每小时被crond执行一次。
配置文件/etc/anacrontab
-
四个字段:
period in days、delay in minutes、job-identifier、command。 -
详见
man anacrontab -
以cron.daily来展示执行的流程:
# 鸟哥第四版原文
1. 由 /etc/anacrontab 分析到 cron.daily 这项工作名称的天数(period in days)为 1 天;
2. 由 /var/spool/anacron/cron.daily 取出最近一次执行 anacron 的时间戳;
3. 由上个步骤与目前的时间比较,若差异天数为 1 天以上 (含 1 天),就准备进行指令;
4. 若准备进行指令,根据 /etc/anacrontab 的设定,将延迟(delay in minutes) 5 分钟 + 3 小时 (看 START_HOURS_RANGE 的
设定);
5. 延迟时间过后,开始执行后续指令,亦即『 run-parts /etc/cron.daily 』这串指令;
6. 执行完毕后, anacron 程序结束。
【*】anacron和crontab的关系总结
- 简单来说,cron.hourly由crond每小时直接执行,而cron.daily、cron.weekly、cron.monthly都是由crond间接调用anacron程序来执行。详见crond服务会读取并执行哪些位置的配置:第5点

浙公网安备 33010602011771号