今天在研究日志切割工具logrotate时,发现它的每日执行并不是通过常见的使用crontab
语法创建,而是将其放在了 /etc/cron.daily
目录中。
使用crontab -l
显示的内容与/var/spool/cron/crontabs
目录下对应用户名的文件内容相同(比如root用户创建的计划任务则为root文件),也就是说通常我们新建一个任务就会往该文件中增加一行内容。
而cron除了执行上面提到的用户文件外还会执行/etc/crontab
中的内容(其中包含了执行/etc/cron.daily
、/etc/cron.weekly
和/etc/cron.monthly
三个目录下的文件)。
但是cron适合在那些24X7不间断运行的机器如服务器上运行的计划任务。如果中间有关机,那么上述那些计划任务有可能不被执行。
此时就需要用到另一个命令anacron
,它的目的就是为了在用户关机重启后能够继续执行之前的计划任务。
anacron命令的基本格式
选项 | 功能 |
---|---|
-f | 强制执行相关工作,忽略时间戳。 |
-u | 更新/var/spool/anacron/cron.{daily,weekly,monthly} 文件中的时间戳为当前日期,但不执行任何工作。 |
-s | 依据/etc/anacrontab 文件中设定的延迟时间顺序执行工作,在前一个工作未完成前,不会开始下一个工作。 |
-n | 立即执行/etc/anacrontab 中所有的工作,忽略所有的延迟时间。 |
-q | 禁止将信息输出到标准错误,常和 -d 选项合用。 |
anacron的配置
在当前的Linux中,其实不需要执行任何anacron命令,只需要配置好/etc/anacrontab
文件,系统就会依赖这个文件中的设定来通过anacron执行定时任务了。那么,关键就是/etc/anacrontab
文件的内容了。这个文件的内容如下:
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root
#前面的内容和/etc/crontab类似
#the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
#最大随机廷迟
#the jobs will be started during the following hours only
START_H0URS_RANGE=3-22
#fanacron的执行时间范围是3:00~22:00
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
#每天开机 5 分钟后就检查 /etc/cron.daily 目录内的文件是否被执行,如果今天没有被执行,那就执行
7 25 cron.weekly nice run-parts /etc/cron.weekly
#每隔 7 天开机后 25 分钟检查 /etc/cron.weekly 目录内的文件是否被执行,如果一周内没有被执行,就会执行
©monthly 45 cron.monthly nice run-parts /etc/cron.monthly
#每隔一个月开机后 45 分钟检查 /etc/cron.monthly 目录内的文件是否被执行,如果一个月内没有被执行,那就执行
执行部分的格式如下:
period delay job-identifier command
其中:
period
- 这是任务的频率,以天来指定,或者是 @daily、@weekly、@monthly 代表每天、每周、每月一次。你也可以使用数字:1 - 每天、7 - 每周、30 - 每月,或者 N - 几天。delay
- 这是在执行一个任务前等待的分钟数。job-id
- 这是写在日志文件中任务的独特名字。command
- 这是要执行的命令或shell脚本。
例如:
@daily 10 example.daily /bin/bash /home/aaronkilik/bin/backup.sh
表示开机10分钟后会运行backup.sh
脚本,而无需等待特定周期。
下表是cron以及anacron的简单比较:
cron | anacron |
---|---|
它是守护进程 | 它不是守护进程 |
适合服务器 | 适合桌面/笔记本电脑 |
可以让你以分钟级运行计划任务 | 只能让你以天为基础来运行计划任务 |
关机时不会执行计划任务 | 如果计划任务到期,机器是关机的,那么它会在机器下次开机后执行计划任务 |
普通用户和 root 用户都可以使用 | 只有 root 用户可以使用(使用特定的配置启动普通任务) |
简而言之,cron和anacron主要的区别在于cron能在那些持续运行的机器上有效地运行,而anacron是针对那些会在一天内或者一周内会关机的机器。
参考资料
https://linux.cn/article-8590-1.html
https://www.sidney.wiki/xitongyunwei/474