使用 Anacron 处理 Linux 关机问题

红薯 发布于 2009/05/16 21:55
阅读 308
收藏 0

Linux® 最初使用 Cron 自动执行常规系统维护,比如替换日志文件和更新垃圾信息过滤规则。这种方法可以很好地服务于全天候运行的服务器和其他系统。但是,如果要在不使用计算机时 关闭它以节约资源(常见于台式机和笔记本系统),那么则不能运行 Cron。如果不能定期运行 Cron,将会生成大量的日志文件并引发其他问题。Anacron 实用工具提供了一种解决方案,支持计算机在每次开机后运行常规的维护作业,即使这些开机时间是不固定的。

问题

如果在台式机 或笔记本电脑中运行 Linux(或大多数其他 UNIX 系统),那么可能会经常关闭系统。确实,有些系统在一天中关机的时间也许要比开机的时间还长。这可以帮助减少电费。对于笔记本电脑来说,如果在旅途中没有 电源插座,经常关机有助于延长电脑的使用时间。不幸的是,这种经常性地关机行为会为 Linux 系统带来问题,因为 Linux 使用称为 Cron 的实用工具在后台运行日常的维护作业。当这些作业停止运行时,就会引发问题,时间一长,系统的性能就会越来越低。

Cron 的设计目的是在无人值守的情况下,在指定的时间启动程序。一般来说,共有两种类型的 Cron 作业(即由 Cron 运行的程序):系统 Cron 作业,由系统运行,执行系统维护任务;另一种是 用户 Cron 作业,由用户创建,用于执行用户任务。对于这两种作业而言,系统 Cron 作业更加重要一些。这些作业可能包括清除 /tmp 中的陈旧文件、替换日志文件、更新垃圾邮件过滤规则,以及更新 locate 数据库。

大 部分 Linux 系统在 /etc 中包含了一系列与 Cron 有关的子目录。/etc/crontab 文件指定 Cron 应该将哪些作业作为系统 Cron 作业运行。通常来讲,该文件告诉 Cron 分别按照每小时、每天、每周和每月的时间间隔运行位于 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly 中的脚本。运行这些作业的精确时间在 /etc/crontab 中指定。对于每天运行和以更长时间间隔运行的作业,运行时间通常为早晨。问题在于,台式机和笔记本系统很可能在这些时间是关闭的。

当 Cron 作业无法运行时,各种问题就随之而来。具体问题取决于本来应当运行的 Cron 作业,但举例来说,问题包括日志文件变大,/tmp 目录变乱,以及数据库过期问题,这些数据库用于存储可用软件更新或本地系统命令的位置。

显然,保持运行 Cron 作业非常重要。如果需要经常关闭某个系统,应当寻找一种方法来避免这些问题。Anacron 正是实现这个目标的解决方案。

 




回页首


开始使用 Anacron

如果使用 Anacron 可以为您所管理的系统带来好处,您应当首先了解它的功能。随后,您可以获取、安装并配置该软件,然后将它链接到现有的 Cron 配置。

Anacron 的基本原理

Anacron 的目的并不是完全替代 Cron。尽管对于经常关闭的系统来说,Cron 会造成一些严重的问题,但是,对于经常运行的作业,比如远程邮件服务器上每小时进行一次的新邮件检查,Cron 仍然是一个重要的工具。Anacron 的目的是补充 Cron,而不是替代它。

Cron 是作为守护进程运行的,与此不同的是,Anacron 是作为普通进程运行并终止的。Anacron 维护了一组应当运行的作业,每个作业都一个相关的运行间隔。每次运行时,Anacron 将检查作业列表以了解自最后一次运行某个作业后,是否超过了该作业的指定时间间隔。如果是的话,Anacron 将运行该作业。

这种设计方法意味着 Anacron 必须定期运行。运行 Anacron 小节描述了两种方法。每种方法各有利弊。一般来讲,Anacron 是由根用户运行的,但是普通用户可能也使用 Anacron,就像在 Anacron 的个人应用 中描述的那样。

获取并安装 Anacron

大多数 Linux 发行版都在其软件包中包括了 Anacron。因此,通过输入 yum install anacronapt-get install anacron 或类似的内容,就可以安装该软件。如果您的发行版没有包含 Anacron 包,那么需要从源代码中下载并安装该包。不幸的是,Anacron Web 站点并没有包含 tarball 链接;您需要使用 Concurrent Versions System (CVS) 获得下载:


清单 1. 从 CVS 下载 Anacron

				              
cvs -d:pserver:anonymous@anacron.cvs.sourceforge.net:/cvsroot/anacron login
cvs -z3 -d:pserver:anonymous@anacron.cvs.sourceforge.net:/cvsroot/anacron co -P anacron

 

输入第一条命令后,将作为 guest 用户登录到 CVS 库。这将提示您输入密码。只需要按下 Enter 键(guest 访问不需要用到密码)。第二个命令将把 Anacron 源代码下载到名为 anacron 的子目录中。

使用 CVS 获得 Anacron 的一个缺点就是有时候这种方法并不可靠。如果软件没有得到彻底的编译,您可以尝试自己解决问题,否则需要等待一两天直到他人帮助您修复问题。如果问题继续存在,那么最好追踪预编译的二进制文件,即使这意味着寻找另一个发行版的文件。

Anacron 中的一个常见 bug 是 gregor.c:79: error: assignment of read-only variable 'isleap'。修复这个 bug 的方法是编辑 gregor.c 文件第 79 行,并删除该行开始部分的字符串 const

获得 Anacron 源代码后,可以按照下面的步骤进行安装(注意,如果已经为发行版安装了预编译的二进制文件,则不需要执行这些步骤):

  1. 切换到由 cvs 创建的 Anacron 目录。
  2. 作为一个可选步骤,编辑 Makefile 以调整软件安装目录或其他编译细节。
  3. 输入 make 以构建软件。
  4. 作为 root,输入 make install 以安装软件。

安装完软件后,不管是使用发行版的包管理,还是从源代码中安装,都应该继续进行配置并运行 Anacron。

配置 Anacron

Anacron 通过 /etc/anacrontab 文件进行控制。该文件可以包含注释行(使用一个前导散列符号 # 表示)、环境变量分配(比如 SHELL=/bin/bash)和作业定义。最后一项是最重要的。它们类似以下的内容:


清单 2. 样例作业定义

				
1 5 cron.daily run-parts /etc/cron.daily

 

每项作业定义包含四个字段:

  1. 运行时间,单位为天(上例中为 1)。
  2. 启动 Anacron 和运行作业之间的延迟,单位为分钟,前提是自最后一次运行之后所经过的时间超出了运行时间。您可能需要对作业使用不同的运行延迟,防止所有作业同时运行,从而影响系统性能。
  3. 作业名(前例中为 cron.daily)。
  4. 要运行的命令。在前例中,命令名为 run-parts /etc/cron.daily

前例的目的是替换运行日常 Cron 作业的 /etc/crontab 中的普通代码行。当设置并运行 Anacron 后,应当能够删除对应的 /etc/crontab 行,并且系统将继续正常运行 — 如果系统经常在运行日常 Cron 作业时被关闭,那么在替换后会得到更好的性能。

在开始配置 Anacron 时,第一步需要检查 /etc/crontab 并将其较长的日常条目转换为 Anacron 作业。但是,不应该将每小时执行一次的 Cron 作业转换为 Anacron 形式;对于间隔时间短于一天的作业,Anacron 并不适合替代 Cron。严格地说,何时运行 Anacron 作业是由您选择的 Anacron 启动方法决定的,如下所示。

 




回页首


运行 Anacron

配置好 Anacron 后,现在可以启动它。由于这是一项必须定期执行的作业,仅仅输入一次 Anacron 是远远不够的。有两种常见的定期运行 Anacron 的方法:可以在启动计算机时启动 Anacron,或者通过一项 Cron 作业启动该程序。使用哪一种方法,取决于日常使用计算机的方式。通常来讲,Anacron 将处理系统作业,但是您还可以使用它处理相当于用户 Cron 作业的内容,因此您可能需要配置它来同时运行这两种类型的作业。

在启动时运行 Anacron

如 果频繁地关闭和重启计算机(每天一次或多次),那么在启动计算机时运行 Anacron 是个不错的选择。在计算机启动后,Anacron 将检查应当运行的作业,并且如果有必要的话,将运行它们。在典型的业务环境中,对于台式机,很可能在用户开始其工作不久之后就运行 Anacron 作业。对于笔记本电脑,运行周期可能更加难以预测(注意 “启动” 意味着完整的系统启动;如果计算机通常被置于休眠模式而不是被关闭,那么系统启动脚本将不会运行,因此这种方法将不会定期运行 Anacron 作业)。

要在启动时运行 Anacron,必须创建一个 SysV 启动脚本来启动该软件。完成这项工作的脚本很简单,只需下面两行代码:


清单 3. 运行 Anacron 的启动脚本

				            
#/bin/bash
anacron

 

可以将此脚本放到 /etc/init.d、/etc/rc.d/init.d 或您的发行版放置其启动脚本的任何位置。随后可以在标准运行级别的目录(比如 /etc/rc3.d 或 /etc/rc.d/rc3.d)中创建到该脚本的链接。您应当为这个链接指定一个名字(比如 S99anacron),以确保 Anacron 是在系统启动时启动的(“S” 将指示系统在启动时运行此脚本,而 “99” 表示相对于其他启动脚本,系统应当在何时运行此脚本)。

如果您的发行版包含一个 Anacron 包,那么该包可能包含相应的 SysV 启动脚本,因此您仅需要进行检查,确保在启动计算机时运行 Anacron。您可以查找名称以 S 开头的启动脚本链接,或者可以使用 chkconfigksysv 等工具来调整配置。

将 Anacron 配置为在系统启动时运行后,应当对日志文件和由 Anacron 作业管理的其他特性进行一段时间的观察。进行检查,确保 Anacron 作业在合适的时间运行(注意,每次 Anacron 运行一个日志文件替换作业时,日志文件不一定被替换,这取决于 logrotate 配置)。

从 Cron 运行 Anacron

如果在一天之内,计算机的关闭和重启次数少于一次,或者您使用了休眠模式而不是彻底关闭计算机,那么您需要通过 Cron 作业运行 Anacron。您可以在您的 /etc/crontab 文件内创建一个条目来完成这项工作,如下所示:


清单 4. 运行 Anacron 的 Cron 作业

				 
17 * * * * root anacron

 

该条目将在每一个小时的第 17 分钟时运行 Anacron,它将检查作业并在必要时运行它。注意,Anacron 只在必要时运行其作业,因此,如果一个小时之内的运行次数小于一次,那么这样做的意义不大,除非您可以预测系统的启动时间 — 并且在这种情况下,您可能需要使用 Cron 来调度作业。

在通过 Cron 作业运行 Anacron 时,相对于用户行为,您并不能十分肯定 Anacron 作业的运行时间。Anacron 作业可能会在不恰当的时刻耗尽 CPU 时间。与这形成对比的是在用户启动计算机后不久就运行 Anacron 作业,并以系统启动进程的形式运行 Anacron。

Anacron 的个人应用

前 面的步骤假设将 Anacron 用于运行系统 Cron 作业。大部分情况是这样的,但是普通用户也可以运行 Anacron 管理个人 Cron 作业,这些作业应当每天执行或以更长的时间间隔执行。基本原理是相同的,但是要创建一个个性化的 Anacron 配置,必须使用 -t 参数启动该程序,这将获取替换配置文件的文件名,以及使用一个 -S 参数,该参数指定 Anacron 存储其 spool 文件的目录:

anacron -t ~/.anacrontab -S ~/.anacron/

用 户可以在其个人 Cron 配置中使用这类调用,或者使用自己的登录脚本完成作业。无论哪种情况,都必须存在 spool 目录,而 Anacron 配置文件使用的格式与系统 Anacron 作业相同。和系统配置一样,普通 Cron 工具应当每小时运行一次或使用小于一天的时间间隔。

 




回页首


结束语

对 于不需要全天候运行的计算机来说,Anacron 是十分有用的工具。您可以将每日或更长时间执行的大部分或全部 Cron 作业转移到 Anacron 上,确保这些作业在系统每次启动时运行;或者通过 Cron 每小时(或其他时间间隔)运行 Anacron,以运行难以预测的作业。

尽管 Anacron 是非常有用的工具,但是它也有缺点。最明显的是,当用户需要完成工作时,Anacron 运行作业时可能会耗尽 CPU 时间或以其他方式损害系统性能。鉴于这个原因,最好将 Anacron 应用于真正需要它的系统,比如经常在夜晚关机的笔记本电脑和台式机,而 Cron 作业通常在夜晚运行。

加载中
返回顶部
顶部