今天在研究日志切割工具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的简单比较:

cronanacron
它是守护进程它不是守护进程
适合服务器适合桌面/笔记本电脑
可以让你以分钟级运行计划任务只能让你以天为基础来运行计划任务
关机时不会执行计划任务如果计划任务到期,机器是关机的,那么它会在机器下次开机后执行计划任务
普通用户和 root 用户都可以使用只有 root 用户可以使用(使用特定的配置启动普通任务)

简而言之,cron和anacron主要的区别在于cron能在那些持续运行的机器上有效地运行,而anacron是针对那些会在一天内或者一周内会关机的机器。

参考资料

https://linux.cn/article-8590-1.html
https://www.sidney.wiki/xitongyunwei/474

最后修改:2025 年 01 月 24 日
如果觉得我的文章对你有用,请随意赞赏