首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 cron 进行自动维护(3)

使用 cron 进行自动维护(3)

替代 cron 的机制尽管 cron 确实很有用,但是您还应该了解可以替代它的两种机制。               
anacron如果系统常常关机或进入休眠状态(例如,如果使用 UNIX 笔记本计算机的话),那么可以考虑在系统中添加 anacron。anacron 与 cron 的相似之处在于,它也把作业安排在以后运行;但是,与 cron 不同,即使作业的预定运行时间已经过了,anacron 也会运行作业。                       
例如,如果安排在星期六运行文件系统备份,但是系统在星期五到星期一关机了,那么当系统在星期一重新启动时,anacron 会立即运行星期六的作业。与之相反,cron 仅仅检查现在是否应该运行作业;因此,如果在作业的预定运行时间系统是关闭的,就不运行作业。                       
anacron 的调度选项比 cron 少得多。它只能以整天的时间间隔调度作业,比如一天、7 天或 30 天;但是对于那些必须频繁且可靠地运行的作业,它是更好的选择。                       
另外,必须从 cron 启动 anacron。每当 anacron 运行时,它读取自己的配置文件。配置文件包含由作业及其频率(用天数表示)组成的配置对。如果作业在预定的时间没有运行,anacron 就运行此作业并记录运行作业的时间。运行完所有作业之后,anacron 退出。                       
在大多数 Linux 发行版上都可以找到 anacron,但是也很容易自己下载并构建源代码。访问  获得最新版本。                       
anacron 的主要配置文件可以在 /etc/anacron 中找到。可以像配置 cron 时那样设置环境变量,但是更简单:                       
1
2
3
4
SHELL=/bin/zsh
PATH=/usr/bin:/bin:/usr/local/bin
# format: frequency delay name job
1 10 day-to-day daily.chores.sh




第一个数字是周期,所以 1 表示每天运行一次,7 表示每 7 天运行一次,等等。第二个数字是延迟,也就是从 anacron 启动之后到执行这个作业之间等待的分钟数。如果把延迟字段设置为不同的值,就可以防止所有作业同时启动。名称 day-to-day 只是一个有帮助的昵称。配置行的其余部分指定作业;在这里,每天运行在指定路径中找到的 shell 脚本 daily.chores.sh 一次。                       
anacron 以手册页形式提供了出色的文档,还可以在网上找到关于 anacron 的提示。(请阅读我在 2007 年 10 月编辑的 )。anacron 适合 UNIX 爱好者和需要额外保障的系统管理员使用。                       
launchd:cron 的现代替代机制cron 确实是一种功能强大、值得信赖的实用程序,它的广泛流行就证明了这一点。Vixie cron 最近又有所改进,比如增加了简写方式 @reboot,进一步简化了管理。但是,cron 仍然有一些缺点:                       
  • 尽管可以在 crontab 文件中定义 cron 作业,但是不能从命令行启动和停止 cron 作业。另外,不能在命令行上创建专用作业并提交给日历。
  • cron 不实施资源限制。如果作业作为根用户运行,就能够消耗无数的处理器时间和内存。在实践中,可能希望限制一个作业,以免它影响其他 cron 作业和系统操作的总体质量。
  • cron 作业严格地与一个调度计划相关联。例如,无法只在发生某一事件(比如创建一个文件)时启动作业。
  • 从更大的范畴来看,类 UNIX 系统的许多核心组件都能够根据需要启动其他程序,包括 cron、用于网络守护进程的 xinetd(或 inetd)和 init(所有系统进程的起源)。每个核心组件都有自己的配置文件,所以很难知道哪个组件最适合完成某个修改。
为了克服这些缺点,Apple Computer 开发了一个统一的启动工具 launchd,它可以在引导时、根据需要和按照指定的时间间隔启动进程。实际上,在 Mac OS 10.4 Tiger 中 launchd 已经替代了 cron(和 init 以及用来引导和初始化系统的其他几个系统实用程序)。(Apple 在系统上保留了 cron,以便为用户提供方便,而且 Vixie cron 的调度选项更灵活)。Mac OS X 的引导速度很快确实可以归功于 launchd:它会在引导时列出要启动的程序,但是只在首次需要时执行程序。                       
launchd 是开放源码的,可以从  上它的主页获得源代码。目前,launchd 已经被移植到 FreeBSD 上,但是还没有移植到其他 UNIX 或 Linux 系统。但是,许多项目正在积极地实现与 launchd 等效的程序,所以简要地了解它的特性是有必要的:                       
  • launchd 并不创建作业来检查目录中是否有新文件,而是自动监视目录中是否有新文件或者监视空目录中是否添加了任何文件,并根据需要启动作业。launchd 不执行轮询;而是使用 kqueues 设施让内核在目录发生变化时通知它。(Linux 具有一种相似的事件设施 inotify,以后的一篇 developerWorks 文章将讨论它) 。
  • 如果指定了,launchd 会使用 chroot 把您的作业发送到一个新目录。chroot 读作 “cha-root”,它是一个系统调用,可以改变前向斜杠(/)和根目录指向的目录。因此,如果使用 chroot 把文件发送到 /opt/root,/opt/root 之外的所有文件就是不可访问的(毕竟,/opt/root 现在是 /,也就是文件系统的顶级目录),/opt/root 中的所有目录成为一级目录。通常使用 chroot 限制作业,使代码无法进入更大的文件系统,以避免产生损害。
  • 可以为作业设置资源限制。可以限制的资源包括内存、堆栈大小和打开的文件的最大数量。
  • 当定义一个任务并把它装载到 launchd 中之后,可以按照名称从命令行启动和停止作业。
launchd 由三个组件组成:launchd 守护进程本身;用来添加、修改和删除作业以及控制 launchd 的 launchctl 实用程序;一个或多个配置文件,每个文件定义一个或多个作业。由于它起源于 Mac OS X,launchd 配置文件只是简单的属性文件,可以用 Extensible Markup Language (XML) 表示。                       
简单地说,在 Mac OS X 上使用 launchd 的步骤如下(要监视一个目录中添加的文件并根据需要运行作业):                       
  • 创建一个属性文件来表达此作业及其所有属性。                                                可以使用 Mac 的 Property Editor,也可以手工编辑 XML。无论采用哪种方法,产生的文件都应该与  相似。                                               
    清单 1. 监视文件系统目录变化的 launchd 作业示例       
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST
                1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>Label</key>
        <string>com.example.processor</string>
        <key>OnDemand</key>
        <true/>
        <key>Program</key>
        <string>/Users/strike/bin/processor</string>
        <key>ProgramArguments</key>
        <array>
            <string>processor</string>
        </array>
        <key>WatchPaths</key>
        <array>
            <string>/Users/strike/data/incoming</string>
        </array>
    </dict>
    </plist>




    简单地说,当 /Users/strike/data/incoming 目录的内容发生变化时,此文件运行 /Users/strike/bin/processor 中的实用程序脚本。把 OnDemand 设置为 True 让 launchd 根据需要启动此作业。把此文件保存到 ~/Library/LaunchAgents/com.example.processor.plist。                                               
  • 用 launchctl 把此作业装载到 launchd 中:
    1
    % launchctl load ~/Library/LaunchAgents/com.example.processor.plist




    如果希望检查最近的操作或查看保存的作业的列表,只需输入 launchctl list。                                               
  • 要想删除作业,只需带 unload 选项使用 launchctl:
    1
    % launchctl unload -w ~/Library/LaunchAgents/com.example.processor.plist




    -w 的作用是什么?它完全删除 launchd 中的作业。如果没有这个选项,作业会在登录时自动地重新装载(因为作业还在启动代理的用户集合中)。                                               
launchd 手册页包含大量信息;如果您是 Mac OS X 用户,还可以找到大量针对 launchd 的应用程序。一些聪明的开发人员正在把 launchd 迁移到更广泛的平台。
返回列表