14.3.配置 `cron(8) `__ ============================================================================================ cron 是 FreeBSD 中最有用的工具之一。这个工具在后台运行,并定期检查 **/etc/crontab** 中要执行的任务,并搜索 **/var/cron/tabs** 中的自定义 crontab 文件。这些文件被用来安排 cron 在指定时间运行的任务。crontab 中的每个条目都定义了一个要运行的任务,被称为 *cron 作业*\ (job)。 FreeBSD 使用了两种不同类型的配置文件:系统级 crontab 和用户级 crontab,其中不应该对前者进行修改,但后者可以根据需要来创建和编辑, 这些文件使用的格式在 `crontab(5) `__ 的手册中有说明。需要注意的是,系统级 crontab 的某些格式,即 **/etc/crontab** 包括的 ``who`` 列,在用户级 crontab 中不存在。在系统级 crontab 中,cron 以该列中指定的用户身份运行命令。在用户级 crontab 中,所有命令都以创建 crontab 的用户的身份运行。 用户级 crontab 允许单个用户安排他们自己的任务,root 用户也可以有一个用户级 **crontab**\ ,用以安排在系统级 **crontab** 中不存在的任务。 如下是一个系统级 crontab,即 **/etc/crontab** 的示例: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # /etc/crontab - root's crontab for FreeBSD # # $FreeBSD$ ① SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin ② # #minute hour mday month wday who command ③ # */5 * * * * root /usr/libexec/atrun ④ 对上述配置文件的解释如下: ① 以 ``#`` 开头的部分是注释,可以起到提醒的作用。注释不能和命令放在同一行,否则会被当成命令的一部分,因此注释必须另起一行。空行在执行过程中会被忽略。 ② 等于号(=)符号是被用来定义环境设置的。在这个实例中,它被用来定义 ``SHELL`` 和 ``PATH``\ 。如果 ``SHELL`` 变量被省略的话,cron 将会使用默认的 Bourne Shell;如果 ``PATH`` 被省略的话,当你运行某个程序或脚本时,将必须给定其完整路径。 ③ 这一行定义了系统级 crontab 所使用的七个字段(或参数):\ ``minute``\ 、\ ``hour``\ 、\ ``mday``\ 、\ ``month``\ 、\ ``wday``\ 、\ ``who`` 以及 ``command``\ 。其中,\ ``minute`` 字段运行指定命令的时间(以分钟为单位),\ ``hour`` 是代表在一日中的第几个小时,\ ``mday`` 是指在一月中的某日,\ ``month`` 是指月份,\ ``wday`` 则是指在一周中的哪一天。这些字段的值必须是数字类型的,且使用 24 小时制。若使用 ``*`` 的话,则是指那个字段所包含的所有值,即对该字段下的条件不做限定。\ ``who`` 字段仅在系统级 crontab 中使用,是用来指定运行该命令的用户的。最后一个字段的对应值是你想要运行的程序。 ④ 这一行指定了这个 cron 任务的具体细节,即各个参数的对应值。比如,\ ``*/5``\ ,以及它后面的那四个 ``*``\ ,代表了这个由 ``root`` 用户执行的 ``/usr/libexec/atrun`` 命令,需要在每月、每周的每天内,每隔五分钟执行一次。命令可以包含任何数目的开关。扩展到多行的命令需要用反斜杠“\\”字符断开。 14.3.1.创建用户级的 crontab --------------------------- 要创建一个用户级 crontab,在编辑模式下调用 ``crontab``\ : .. raw:: latex \diilbookstyleinputcell .. code:: shell-session % crontab -e 这将使用默认的文本编辑器打开用户的 crontab。用户第一次运行这个命令时,它将打开一个空文件,若用户曾经创建过 crontab,该命令将打开该文件进行编辑。 将这些行添加到 crontab 文件的顶部是很有用的,以便设置环境变量和记录 crontab 中各字段的含义: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin # Order of crontab fields # minute hour mday month wday command 然后为每个要运行的命令或脚本添加一行,并在此指定运行该命令的时间。这个例子是每天下午两点运行指定的自定义 Bourne shell 脚本。由于脚本的路径没有在 ``PATH`` 中指定,所以我们给出了脚本的完整路径: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session 0 14 * * * /usr/home/dru/bin/mycustomscript.sh .. **技巧** 在使用自定义脚本之前,请确保它是可执行的,并且用 cron 在设置的有限环境变量下来进行测试。要复制用于运行上述 cron 条目的环境,请使用: .. code:: shell-session env -i SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin HOME=/home/dru LOGNAME=dru /usr/home/dru/bin/mycustomscript.sh 有关 cron 环境的设置可以在 `crontab(5) `__ 手册中找到。如果脚本中包含任何使用通配符删除文件的命令,检查脚本是否在 cron 环境中正确运行就显得尤为重要。 当完成编辑 crontab 后,保存该文件,之后它将被自动读取,cron 会读取 crontab 并在其指定的时间运行其 cron 作业。要列出 crontab 中的 cron 作业,使用这个命令: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session % crontab -l 0 14 * * * /usr/home/dru/bin/mycustomscript.sh 要删除这个用户级 crontab 中的所有 cron 作业,使用这个命令: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session % crontab -r remove crontab for dru? y