本文主要是介绍第16章、 例行性工作排程 (crontab),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
16.1. 什么是例行性工作排程
这些例行性工作,通常你得要记录在行事历上面才能避免忘记!不过,由于我们常常在计算机前面的缘故, 如果计算机系统能够主动的通知我们的话,那么不就轻松多了!这个时候 Linux 的例行性工作排程就可以派上场了! 在不考虑硬件与我们服务器的链接状态下,我们的 Linux 可以帮你提醒很多任务,那么 Linux 的例行性工作是如何进行排程的呢?所谓的排程就是将这些工作安排执行的流程之意! 咱们的 Linux 排程就是透过 crontab 与 at 这两个东西!
16.1.1. Linux 工作排程的种类: at, crontab
从上面的说明当中,我们可以很清楚的发现两种工作排程的方式:
- 一种是例行性的,就是每隔一定的周期要来办的事项;
- 一种是突发性的,就是这次做完以后就没有的那一种 (计算机大降价…)
那么在 Linux 底下如何达到这两个功能呢?那就得使用 at 与 crontab 这两个好东西!
- at :at 是个可以处理仅执行一次就结束排程的指令,不过要执行 at 时, 必须要有 atd 这个服务 (第十八章) 的支援才行。在某些新版的 distributions 中,atd 可能预设并没有启动,那么 at 这个指令就会失效!不过我们的 CentOS 预设是启动的!
- crontab :crontab 这个指令所设定的工作将会循环的一直进行下去! 可循环的时间为分钟、小时、每周、每月或每年等。crontab 除了可以使用指令执行外,亦可编辑 /etc/crontab 来支持。 至于让 crontab 可以生效的服务则是 crond 这个服务 !
底下我们先来谈一谈 Linux 的系统到底在做什么事情,怎么有若干多的工作排程在进行呢?然后再回来谈一谈 at 与 crontab 这两个好东西!
16.1.2. Linux 上常见的例行性工作
如果你曾经使用过 Linux 一阵子了,那么你大概会发现到 Linux 会主动的帮我们进行一些工作! 比方说自动的进行在线更新 (on-line update)、自动的进行 updatedb (第七章谈到的 locate 指令) 更新文件名数据库、自动的作登录档分析 (所以 root 常常会收到标题为 logwatch 的信件) 等等。这是由于系统要正常运作的话, 某些在背景底下的工作必须要定时进行的缘故。基本上 Linux 系统常见的例行性任务有:
进行登录档的轮替 (log rotate):
Linux 会主动的将系统所发生的各种信息都记录下来,这就是登录档 (第十九章)。 由于系统会一直记录登录信息,所以登录文件将会越来越大!我们知道大型档案不但占容量还会造成读写效能的困扰, 因此适时的将登录文件数据挪一挪,让旧的数据与新的数据分别存放,则比较可以有效的记录登录信息。这就是 log rotate 的任务!这也是系统必要的例行任务;登录文件分析 logwatch 的任务:
如果系统发生了软件问题、硬件错误、资安问题等,绝大部分的错误信息都会被记录到登录文件中, 因此系统管理员的重要任务之一就是分析登录档。但你不可能手动透过 vim 等软件去检视登录文件,因为数据太复杂了! 我们的 CentOS 提供了一只程序『 logwatch 』来主动分析登录信息,所以你会发现,你的 root 老是会收到标题为 logwatch 的信件,那是正常的!你最好也能够看看该信件的内容!建立 locate 的数据库:
在第七章我们谈到的 locate 指令时, 我们知道该指令是透过已经存在的文件名数据库来进行系统上文件名的查询。我们的文件名数据库是放置到 /var/lib/mlocate/ 中。 问题是,这个数据库怎么会自动更新啊?这就是系统的例行性工作所产生的效果!系统会主动的进行 updatedb !whatis 数据库的建立:
与 locate 数据库类似的,whatis 也是个数据库,这个 whatis 是与 man page 有关的一个查询指令,不过要使用 whatis 指令时, 必须要拥有 whatis 数据库,而这个数据库也是透过系统的例行性工作排程来自动执行的!RPM 软件登录文件的建立:
RPM (第二十三章) 是一种软件管理的机制。由于系统可能会常常变更软件, 包括软件的新安装、非经常性更新等,都会造成软件文件名的差异。为了方便未来追踪,系统也帮我们将文件名作个排序的记录! 有时候系统也会透过排程来帮忙 RPM 数据库的重新建置!移除暂存档:
某些软件在运作中会产生一些暂存档,但是当这个软件关闭时,这些暂存盘可能并不会主动的被移除。 有些暂存盘则有时间性,如果超过一段时间后,这个暂存盘就没有效用了,此时移除这些暂存盘就是一件重要的工作! 否则磁盘容量会被耗光。系统透过例行性工作排程执行名为 tmpwatch 的指令来删除这些暂存档!与网络服务有关的分析行为:
如果你有安装类似 WWW 服务器软件 (一个名为 apache 的软件),那么你的 Linux 系统通常就会主动的分析该软件的登录文件。 同时依据某些凭证来认证网络信息是否过期的问题,我们的 Linux 系统也会很亲和的帮你进行自动检查!
其实你的系统会进行的例行性工作与你安装的软件多寡有关,如果你安装过多的软件,某些服务功能的软件都会附上分析工具, 那么你的系统就会多出一些例行性工作!像我的主机还多加了很多自己撰写的分析工具,以及其他第三方协力软件的分析软件,俺的 Linux 工作量可是非常大的!因为有这么多的工作需要进行,所以我们当然得要了解例行性工作的处理方式!
16.2. 仅执行一次的工作排程
16.2.1. atd 的启动与 at 运作的方式: /etc/at.deny
要使用单一工作排程时,我们的 Linux 系统上面必须要有负责这个排程的服务,那就是 atd 。 不过并非所有的 Linux distributions 都预设会把他打开的,所以某些时刻我们必须要手动将他启用才行。 启用的方法就是这样:
重点是那个『正在启动(或 starting)』项目的 OK !那表示启动是正常的!这部份我们在第十八章会谈及。 如果您真的有兴趣,那么可以自行到 /etc/init.d/atd 这个 shell script 内去瞧一瞧先! 至于那个 chkconfig ,你也可以使用 man 先查阅一下啊!我们第十八章再介绍!
一、at 的运作方式
既然是工作排程,那么应该会有产生工作的方式,并且将这些工作排进行程表中!那么产生工作的方式是怎么进行的? 事实上,我们使用 at 这个指令来产生所要运作的工作,并将这个工作以文本文件的方式写入 /var/spool/at/ 目录内,该工作便能等待 atd 这个服务的取用与执行了。
不过,并不是所有的人都可以进行 at 工作排程!为什么?因为安全的理由啊~ 很多主机被所谓的『绑架』后,最常发现的就是他们的系统当中多了很多的怪客程序 (cracker program), 这些程序非常可能运用工作排程来执行或搜集系统信息,并定时的回报给怪客团体! 所以除非是你认可的账号,否则先不要让他们使用 at !那怎么达到使用 at 的列管呢?
我们可以利用 /etc/at.allow 与 /etc/at.deny 这两个档案来进行 at 的使用限制! 加上这两个档案后, at 的工作情况其实是这样的:
- 先找寻 /etc/at.allow 这个档案,写在这个档案中的使用者才能使用 at ,没有在这个档案中的使用者则不能使用 at (即使没有写在 at.deny 当中);
- 如果 /etc/at.allow 不存在,就寻找 /etc/at.deny 这个档案,若写在这个 at.deny 的使用者则不能使用 at ,而没有在这个 at.deny 档案中的使用者,就可以使用 at ;
- 如果两个档案都不存在,那么只有 root 可以使用 at 这个指令。
透过这个说明,我们知道 /etc/at.allow 是管理较为严格的方式,而 /etc/at.deny 则较为松散 (因为账号没有在该档案中,就能够执行 at 了)。在一般的 distributions 当中,由于假设系统上的所有用户都是可信任的, 因此系统通常会保留一个空的 /etc/at.deny 档案,意思是允许所有人使用 at 指令的意思 (您可以自行检查一下该档案)。 不过,万一你不希望有某些使用者使用 at 的话,将那个使用者的账号写入 /etc/at.deny 即可! 一个账号写一行。
16.2.2. 实际运作单一工作排程: at, atq & atrm, batch
单一工作排程的进行就使用 at 这个指令!将 at 加上一个时间即可!基本的语法如下:
老实说,这个 at 指令的下达最重要的地方在于『时间』的指定了!我喜欢使用『 now + … 』 的方式来定义现在过多少时间再进行工作,但有时也需要定义特定的时间点来进行!底下的范例先看看!
事实上,当我们使用 at 时会进入一个 at shell 的环境来让用户下达工作指令,此时,建议你最好使用绝对路径来下达你的指令,比较不会有问题 !由于指令的下达与 PATH 变量有关, 同时与当时的工作目录也有关连 (如果有牵涉到档案的话),因此使用绝对路径来下达指令,会是比较一劳永逸的方法。 为什么呢?举例来说,你在 /tmp 下达『 at now 』然后输入『 mail root -s “test” < .bashrc 』, 问一下,那个 .bashrc 的档案会是在哪里?答案是『 /tmp/.bashrc 』!因为 at 在运作时,会跑到当时下达 at 指令的那个工作目录的缘故!
有些朋友会希望『我要在某某时刻,在我的终端机显示出 Hello 的字样』,然后就在 at 里面下达这样的信息『 echo “Hello” 』。等到时间到了,却发现没有任何讯息在屏幕上显示,这是啥原因啊?这是因为 at 的执行与终端机环境无关,而所有 standard output/standard error output 都会传送到执行者的 mailbox 去啦!所以在终端机当然看不到任何信息。那怎办?没关系, 可以透过终端机的装置来处理!假如你在 tty1 登入,则可以使用『 echo “Hello” > /dev/tty1 』来取代。
at 有另外一个很棒的优点,那就是『背景执行』的功能了!什么是背景执行啊?其实与 bash 的 nohup (第十七章) 类似啦! 、提我自己的几个例子来给您听听:
- 脱机继续工作的任务:我初次接触 Unix 为的是要跑空气质量模式, 那是一种大型的程序,这个程序在当时的硬件底下跑,一个案例要跑 3 天!由于也要进行其他研究工作,因此常常使用 Windows 98 来联机到 Unix 工作站跑那个 3 天的案例!结果你也该知道, Windows 98 连开三天而不当机的机率是很低的。 而当机时,所有在 Windows 上的联机都会中断!包括在跑的那个程序也中断了——明明再三个钟头就跑完的程序, 由于当机害我又得跑 3 天!
- 另一个常用的时刻则是例如上面的范例三,由于某个突发状况导致你必须要进行某项工作时,这个 at 就很好用了!
由于 at 工作排程的使用上,系统会将该项 at 工作独立出你的 bash 环境中, 直接交给系统的 atd 程序来接管,因此,当你下达了 at 的工作之后就可以立刻脱机了, 剩下的工作就完全交给 Linux 管理即可 !所以如果有长时间的网络工作时, 使用 at 可以让你免除网络断线后的困扰!
一、at 工作的管理
那么万一我下达了 at 之后,才发现指令输入错误,该如何是好?就将他移除啊!利用 atq 与 atrm 吧!
如此一来,你可以利用 atq 来查询,利用 atrm 来删除错误的指令,利用 at 来直接下达单一工作排! 不过,如果你是在一个非常忙碌的系统下运作 at , 能不能指定你的工作在系统较闲的时候才进行呢?可以的,那就使用 batch 指令!
二、batch:系统有空时才进行背景任务
其实 batch 是利用 at 来进行指令的下达!只是加入一些控制参数而已。这个 batch 神奇的地方在于:他会在 CPU 工作负载小于 0.8 的时候,才进行你所下达的工作任务! 那什么是负载 0.8 呢?这个负载的意思是: CPU 在单一时间点所负责的工作数量。不是 CPU 的使用率! 举例来说,如果我有一只程序他需要一直使用 CPU 的运算功能,那么此时 CPU 的使用率可能到达 100% , 但是 CPU 的工作负载则是趋近于『 1 』,因为 CPU 仅负责一个工作嘛!如果同时执行这样的程序两支呢? CPU 的使用率还是 100% ,但是工作负载则变成 2 了!
所以也就是说,当 CPU 的工作负载越大,代表 CPU 必须要在不同的工作之间进行频繁的工作切换。 这样的 CPU 运作情况我们在第零章有谈过,忘记的话请回去瞧瞧!因为一直切换工作,所以会导致系统忙碌! 系统如果很忙碌,还要额外进行 at ,不太合理!所以才有 batch 指令的产生! 那么 batch 如何下达指令呢?!与 at 相同!例如下面的范例:
你会发现其实 batch 也是使用 atq/atrm 来管理的!
16.3. 循环执行的例行性工作排程
相对于 at 是仅执行一次的工作,循环执行的例行性工作排程则是由 cron (crond) 这个系统服务来控制的。刚刚谈过 Linux 系统上面原本就有非常多的例行性工作,因此这个系统服务是默认启动的。另外, 由于使用者自己也可以进行例行性工作排程,所以Linux 也提供使用者控制例行性工作排程的指令 (crontab)。
16.3.1. 使用者的设定: /etc/cron.deny, crontab
使用者想要建立循环型工作排程时,使用的是 crontab 这个指令~不过,为了安全性的问题, 与 at 同样的,我们可以限制使用 crontab 的使用者账号!使用的限制数据有:
- /etc/cron.allow: 将可以使用 crontab 的账号写入其中,若不在这个档案内的使用者则不可使用 crontab;
- /etc/cron.deny: 将不可以使用 crontab 的账号写入其中,若未记录到这个档案当中的使用者,就可以使用 crontab 。
与 at 很像吧!同样的,以优先级来说, /etc/cron.allow 比 /etc/cron.deny 要优先, 而判断上面,这两个档案只选择一个来限制而已,因此,建议你只要保留一个即可, 免得影响自己在设定上面的判断!一般来说,系统默认是保留 /etc/cron.deny , 你可以将不想让他执行 crontab 的那个使用者写入 /etc/cron.deny 当中,一个账号一行!
当用户使用 crontab 这个指令来建立工作排程之后,该项工作就会被记录到 /var/spool/cron/ 里面去了,而且是以账号来作为判别的 !举例来说, dmtsai 使用 crontab 后, 他的工作会被记录到 /var/spool/cron/dmtsai 里头去!但请注意,不要使用 vi 直接编辑该档案, 因为可能由于输入语法错误,会导致无法执行 cron !另外, cron 执行的每一项工作都会被记录到 /var/log/cron 这个登录档中,所以如果你的 Linux 不知道是否被植入木马时,也可以搜寻一下 /var/log/cron 这个登录档!
那么我们就来聊一聊 crontab 的语法吧!
预设情况下,任何使用者只要不被列入 /etc/cron.deny 当中,那么他就可以直接下达『 crontab -e 』去编辑自己的例行性命令了!整个过程就如同上面提到的,会进入 vi 的编辑画面, 然后以一个工作一行来编辑,编辑完毕之后输入『 :wq 』储存后离开 vi 就可以了! 而每项工作 (每行) 的格式都是具有六个字段,这六个字段的意义为:
比较有趣的是那个『周』!周的数字为 0 或 7 时,都代表『星期天』的意思!另外, 还有一些辅助的字符,大概有底下这些:
底下的案例请实际用 dmtsai 这个身份!后续的动作才能够搭配起来!
那个 crontab 在 /var/spool/cron 里面! 还有建议您:『指令下达时,最好使用绝对路径,这样比较不会找不到执行档 !』
该如何查询使用者目前的 crontab 内容呢?我们可以这样来看看:
看到了吗? crontab 『整个内容都不见了!』所以请注意:『如果只是要删除某个 crontab 的工作项目,那么请使用 crontab -e 来重新编辑即可!』如果使用 -r 的参数,是会将所有的 crontab 数据内容都删掉的!千万注意了!
16.3.2. 系统的配置文件: /etc/crontab
这个『 crontab -e 』是针对使用者的 cron 来设计的,如果是『系统的例行性任务』时, 该怎么办呢?是否还是需要以 crontab -e 来管理你的例行性工作排程呢?当然不需要,你只要编辑 /etc/crontab 这个档案就可以了!有一点需要特别注意!那就是 crontab -e 这个 crontab 其实是 /usr/bin/crontab 这个执行档,但是 /etc/crontab 可是一个『纯文本档』!你可以 root 的身份编辑一下这个档案!
基本上, cron 这个服务的最低侦测限制是『分钟』,所以『 cron 会每分钟去读取一次 /etc/crontab 与 /var/spool/cron 里面的数据内容 』,因此,只要你编辑完 /etc/crontab 这个档案,并且将他储存之后,那么 cron 的设定就自动的会来执行了!
废话少说,我们就来看一下这个 /etc/crontab 的内容吧!
这个档案与将刚刚我们下达 crontab -e 的内容几乎完全一模一样!只是有几个地方不太相同:
MAILTO=root:
这个项目是说,当 /etc/crontab 这个档案中的例行性工作的指令发生错误时,或者是该工作的执行结果有 STDOUT/STDERR 时,会将错误讯息或者是屏幕显示的讯息传给谁?默认当然是由系统直接寄发一封 mail 给 root !不过, 由于 root 并无法在客户端中以 POP3 之类的软件收信,因此通常都将这个 e-mail 改成自己的账号,好让我随时了解系统的状况!例如: MAILTO=dmtsai@my.host.namePATH=….:
还记得我们在第十一章的 BASH 当中一直提到的执行文件路径问题吧!这里就是输入执行文件的搜寻路径!使用默认的路径设定就已经很足够了!01 * * * * root run-parts /etc/cron.hourly:
这个 /etc/crontab 里面默认定义出四项工作任务,分别是每小时、每天、每周及每个月分别进行一次的工作! 但是在五个字段后面接的并不是指令,而是一个新的字段,那就是『执行后面那串指令的身份』为何!这与使用者的 crontab -e 不相同。由于使用者自己的 crontab 并不需要指定身份,但 /etc/crontab 里面当然要指定身份!以上表的内容来说,系统默认的例行性工作是以 root 的身份来进行的。
那么后面那串指令是什么呢?你可以使用『 which run-parts 』搜寻看看,其实那是一个 bash script !如果你直接进入 /usr/bin/run-parts 去看看, 会发现这支指令会将后面接的『目录』内的所有档案捉出来执行!这也就是说『 如果你想让系统每小时主动帮你执行某个指令,将该指令写成 script,并将该档案放置到 /etc/cron.hourly/ 目录下即可』的意思!
现在你知道系统是如何进行他默认的一堆例行性工作排程了吗?如果你下达『 ll /etc/cron.daily 』就可以看到一堆档案, 那些档案就是系统提供的 script ,而这堆 scripts 将会在每天的凌晨 4:02 开始运作!这也是为啥如果你是夜猫族, 就会发现奇怪的是,Linux 系统为何早上 4:02 开始会很忙碌的发出一些硬盘跑动的声音!因为他必须要进行 makewhatis, updatedb, rpm rebuild 等等的任务!
由于 CentOS 提供的 run-parts 这个 script 的辅助,因此 /etc/crontab 这个档案里面支持两种下达指令的方式, 一种是直接下达指令,一种则是以目录来规划,例如:
指令型态
01 * * * * dmtsai mail -s “testing” kiki < /home/dmtsai/test.txt 以 dmtsai 这个使用者的身份,在每小时执行一次 mail 指令。目录规划
/5 * * * root run-parts /root/runcron 建立一个 /root/runcron 的目录,将要每隔五分钟执行的『可执行文件』都写到该目录下, 就可以让系统每五分钟执行一次该目录下的所有可执行文件。
假设你现在要作一个目录,让系统可以每 2 分钟去执行这个目录下的所有可以执行的档案,你可以写下如下的这一行在 /etc/crontab 中:
/2 * * * root run-parts /etc/cron.min
当然 /etc/cron.min 这个目录是需要存在的!那如果我需要执行的是一个『程序』而已, 不需要用到一个目录呢?该如何是好?例如在侦测网络流量时,我们希望每五分钟侦测分析一次, 可以这样写:
/5 * * * root /bin/mrtg /etc/mrtg/mrtg.cfg
建立例行性命令很简单吧!如果你是系统管理员而且你的工作又是系统维护方面的例行任务时, 直接修改 /etc/crontab 这个档案即可!
16.3.3. 一些注意事项
有的时候,我们以系统的 cron 来进行例行性工作的建立时,要注意一些使用方面的特性。 举例来说,如果我们有四个工作都是五分钟要进行一次的,那么是否这四个动作全部都在同一个时间点进行? 如果同时进行,该四个动作又很耗系统资源,如此一来,每五分钟不是会让系统忙得要死?此时好好的分配一些运行时间就 OK 啦!所以,注意一下:
一、资源分配不均的问题
当大量使用 crontab 的时候,总是会有问题发生的,最严重的问题就是『系统资源分配不均』的问题, 以我的系统为例,我有侦测主机流量的信息,包括:
- 流量
- 区域内其他 PC 的流量侦测
- CPU 使用率
- RAM 使用率
- 在线人数实时侦测
如果每个流程都在同一个时间启动的话,那么在某个时段时,我的系统会变得相当的繁忙, 所以,这个时候就必须要分别设定!我可以这样做:
看到了没?那个『 , 』分隔的时候,请注意,不要有空格符!(连续的意思)如此一来, 则可以将每五分钟工作的流程分别在不同的时刻来工作!则可以让系统的执行较为顺畅!
二、取消不要的输出项目
另外一个困扰发生在『 当有执行成果或者是执行的项目中有输出的数据时,该数据将会 mail 给 MAILTO 设定的账号 』,那么当有一个排程一直出错(例如 DNS 的侦测系统当中,若 DNS 上层主机挂掉,那么你就会一直收到错误讯息!)怎么办?还记得十一章谈到的数据流重导向吧? 直接以『命令重导向』将输出的结果输出到 /dev/null 这个垃圾桶当中就好了!
三、安全的检验
很多时候被植入木马都是以例行命令的方式植入的,所以可以藉由检查 /var/log/cron 的内容来视察是否有『非您设定的 cron 被执行了?』这个时候就需要小心一点!
四、周与日月不可同时并存
另一个需要注意的地方在于:『你可以分别以周或者是日月为单位作为循环,但你不可使用「几月几号且为星期几」的模式工作』。 这个意思是说,你不可以这样编写一个工作排程:
本来你以为九月十一号且为星期五才会进行这项工作,无奈的是,系统可能会判定每个星期五作一次,或每年的 9 月 11 号分别进行,如此一来与你当初的规划就不一样了。所以得要注意这个地方!上述的写法是不对的!
16.4. 可唤醒停机期间的工作任务
如果你的 Linux 主机是作为 24 小时全天、全年无休的服务器之用,那么你只要有 atd 与 crond 这两个服务来管理你的例行性工作排程即可。如果你的服务器并非 24 小时无间断的开机,那么你该如何进行例行性工作? 举例来说,如果你每天晚上都要关机,等到白天才启动你的 Linux 主机时,由于 CentOS 默认的工作排程都在 4:02am 每天进行,如此一来不就一堆系统例行工作都没有人在做了!那可怎么办?此时就得要 anacron 这家伙了!
16.4.1. 什么是 anacron
anacron 并不是用来取代 crontab 的,anacron 存在的目的就在于我们上头提到的,在处理非 24 小时一直启动的 Linux 系统的 crontab 的执行!所以 anacron 并不能指定何时执行某项任务, 而是以天为单位或者是在开机后立刻进行 anacron 的动作,他会去侦测停机期间应该进行但是并没有进行的 crontab 任务,并将该任务执行一遍后,anacron 就会自动停止了。
由于 anacron 会以一天、七天、一个月为期去侦测系统未进行的 crontab 任务,因此对于某些特殊的使用环境非常有帮助。 举例来说,如果你的 Linux 主机是放在公司给同仁使用的,因为周末假日大家都不在所以也没有必要开启, 因此你的 Linux 是周末都会关机两天的。但是 crontab 大多在每天的凌晨以及周日的早上进行各项任务, 偏偏你又关机了,此时系统很多 crontab 的任务就无法进行。 anacron 刚好可以解决这个问题!
那么 anacron 又是怎么知道我们的系统啥时关机的呢?这就得要使用 anacron 读取的时间记录文件 (timestamps) 了! anacron 会去分析现在的时间与时间记录文件所记载的上次执行 anacron 的时间,两者比较后若发现有差异, 那就是在某些时刻没有进行 crontab !此时 anacron 就会开始执行未进行的 crontab 任务了! 所以 anacron 其实也是透过 crontab 来运作的!因此 anacron 运作的时间通常有两个,一个是系统开机期间运作,一个是写入 crontab 的排程中。 这样才能够在特定时间分析系统未进行的 crontab 工作嘛!
16.4.2. anacron 与 /etc/anacrontab
anacron 其实是一支程序并非一个服务!这支程序在 CentOS 当中已经进入 crontab 的排程! 不相信吗?你可以这样追踪看看:
基本上, anacron 的语法如下:
所以我们发现其实 /etc/cron.daily/0anacron 仅进行时间戳的更新,而没有进行任何 anacron 的动作 ! 在我们的 CentOS 中,anacron 的进行其实是在开机完成后才进行的一项工作任务,你也可以将 anacron 排入 crontab 的排程中。但是为了担心 anacron 误判时间参数,因此 /etc/cron.daily/ 里面的 anacron 才会在档名之前加个 0 (0anacron),让 anacron 最先进行!就是为了让时间戳先更新!以避免 anacron 误判 crontab 尚未进行任何工作的意思。
接下来我们看一下 /etc/anacrontab 的内容好了:
由于 /etc/cron.daily 内的任务比较多,因此我们使用每天进行的任务来解释一下 anacron 的运作情况好了。 anacron 若下达『 anacron -s cron.daily 』时,他会这样运作的:
- 由 /etc/anacrontab 分析到 cron.daily 这项工作名称的天数为 1 天;
- 由 /var/spool/anacron/cron.daily 取出最近一次执行 anacron 的时间戳;
- 由上个步骤与目前的时间比较,若差异天数为 1 天以上 (含 1 天),就准备进行指令;
- 若准备进行指令,根据 /etc/anacrontab 的设定,将延迟 65 分钟
- 延迟时间过后,开始执行后续指令,亦即『 run-parts /etc/cron.daily 』这串指令;
- 执行完毕后, anacron 程序结束。
所以说,时间戳是非常重要的!anacron 是透过该记录与目前的时间差异,了解到是否应该要进行某项任务的工作! 举例来说,如果我的主机在 2009/03/15(星期天) 18:00 关机,然后在 2009/03/16(星期一) 8:00 开机,由于我的 crontab 是在早上 04:00 左右进行各项任务,由于该时刻系统是关机的,因此时间戳依旧为 20090315 (旧的时间), 但是目前时间已经是 20090316 (新的时间),因此 run-parts /etc/cron.daily 就会在开机过 65 分钟后开始运作了。
所以 anacron 并不需要额外的设定,使用默认值即可!只是我们的 CentOS 只有在开机时才会执行 anacron 就是了。如果要确定 anacron 是否开机时会主动的执行,你可以下达下列指令:
现在你知道为什么隔了一阵子才将 CentOS 开机,开机过后约 1 小时左右系统会有一小段时间的忙碌!而且硬盘会跑个不停!那就是因为 anacron 正在执行过去 crontab 未进行的各项工作排程啦!
这篇关于第16章、 例行性工作排程 (crontab)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!