一当前PC 环境:
Linux ubuntu 3.16.0-59-generic #79~14.04.1-Ubuntu SMP Mon Jan 18 15:41:27 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
useful link:
http://manpages.ubuntu.com/manpages/wily/man8/anacron.8.html
http://blog.csdn.net/smasegain/article/details/50569486
http://www.thegeekstuff.com/2011/05/anacron-examples/
二作用:
anacron 并不是用来取代 crontab 的,anacron 用于不能全天候开机的电脑,替代完成 cron 命令的守护进程。由于常规的计划任务通常被安排在午夜执行,如果计算机当时没有开机就不会运行这些任务。然而如果是使用anacron, 就可以确保你在下次开启电脑的时候, 任务被执行. anacron 的目的就在于运行这些计划任务,并考虑计算机关机时间。
三特性:
1: 配置文件
$ cat /etc/anacrontab
##### /etc/anacrontab: configuration file for anacron
##### See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
HOME=/root
LOGNAME=root
##### These replace cron's entries
##### period delay job-identifier command
1 5 cron.daily run-parts --report /etc/cron.daily
7 10 cron.weekly run-parts --report /etc/cron.weekly
@monthly 15 cron.monthly run-parts --report /etc/cron.monthly
上面的格式是 period delay job-identifier command
period: 这是任务的周期,以天来指定,或者是 @daily、@weekly、@monthly 代表每天、每周、每月一次。你也可以使用数字:1 - 每天、7 - 每周、30 - 每月,或者 N – 几天。这里的时间不会按照我们日历上的周/月来算,而只是轮回循环的天数.
delay: 这是在执行一个任务前等待的分钟数. 还有在时间间隔period到期后,如果任务没有顺利执行,则会等待此处设置的时间,然后再次尝试执行。
job-identifier: 这是写在日志文件中任务的独特名字。
ls /var/spool/anacron/
cron.daily cron.monthly cron.weekly
用于存放anacron的时间戳文件. anacron每次启动时就会在/var/spool/anacron/
下面建立一个以 job-identifier为文件名的时间戳文件, 里面记录的是上一次任务完成的时间.
cat /var/spool/anacron/cron.daily
20171127
command: 这是要执行的命令或 shell 脚本。
请注意 anacron 会在启动机器之后,频频执行此类活动,有可能导致计算机反应迟缓。这也正是/etc/anacrontab 文件中的任务有时候会以 nice 命令开头,这样可以减小它们执行优先级进而限制它们对系统的影响。可以对比下/etc/anacrontab和 /etc/crontab文件格式的不同.
2: 运行过程
举例anacron执行cron.daily的步骤
1: 启动了anacron执行到/etc/anacrontab中的cron.daily
(系统重新启动或者anacron程序启动sudo /etc/init.d/anacron start|stop|restart|force-reload|reload)
2: 查看/var/spool/anacron/cron.daily中的时间戳文件内容,
3: 取出时间戳的标记时间和当前时间对比, 如果相差超过period即1天就准备执行命令
4: 任务处于ready状态之后, 等待delay规定的时间之后就立刻执行
5: 达到执行条件的任务都完成之后anacron程序就会自动退出.
(anacron 以串行方式调用,在 /etc/init.d 的脚本中加了一个 -s 参数,便是指在前一个任务没有完成时不执行下一个任务, sudo vim /etc/init.d/anacron)
四添加自己的任务:
方法一:
在/etc/cron.daily
或者cron.monthly或者 cron.weekly下面添加cron脚本.
方法二:
直接写入 /etc/anacrontab.
五anacron与crontab 对比: :
crontab | anacron |
---|---|
适合服务器 | 适合桌面/笔记本电脑 |
它是守护进程 | 它不是守护进程 |
关机时不会执行计划任务 | 如果计划任务到期,机器是关机的,那么它会在机器下次开机后执行计划任务 |
可以让你以分钟级运行计划任务 | 只能让你以天为基础来运行计划任务 |
普通用户和 root 用户都可以使用 | 只有 root 用户可以使用(使用特定的配置启动普通任务) |
六anacron语法命令:
anacron [-s] [-f] [-n] [-d] [-q] [-t anacrontab] [-S spooldir] [job]
anacron [-S spooldir] -u [-t anacrontab] [job]
anacron [-V|-h]
anacron -T [-t anacrontab]
-f: 表示强制调用,忽略本来的周期;
-u: 仅更新timestamp文件而不真正调用job,可以用来调整anacron的执行周期;
-s: 串行调用任务,从1.1的(4)可以看到默认就是串行调用,不指定此参数则到时间就直接执行(不便于设置依赖关系);
-n: 跳过delay直接执行,隐含调用了-s的参数;
-d: 不将任务在后台调度,信息会输出到前台,方便调试;
-q: 不显示报错信息到标准输出,可以与-d一起使用;
-t anacron table:指定默认anacrontab以外的其他配置文件;
-T: Anacrontab检验,如果语法有误则返回1,无误返回0;
-S spooldir:指定存放timestamp文件的路径,This option is required for users who wish to run anacron themselves;
-V: 显示版本信息后退出;
-h: 显示简单的帮助信息后退出
七我的疑问:
1: anacron 在完成所有任务之后自动退出了,如果不关机或者重新启动 anacron 服务,那么/etc/anacrontab中的任务如何启动?
意思是除了以上两种情况, /etc/anacrontab中的任务就不需要执行了还是说anacron本身存在某种隔固定时间会自己启动一次?
2: 如果pc上面同时存在crontab和anacron的引用, 那么根据命令的特性, 他们都会调用/etc/cron.hourly/, /etc/cron.daily/, /etc/cron.weekly/, 和 /etc/cron.monthly/中的脚本. 系统是如何处理这之间的矛盾和冲突的?