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 的示例:

# /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    ④

对上述配置文件的解释如下:

① 以 # 开头的部分是注释,可以起到提醒的作用。注释不能和命令放在同一行,否则会被当成命令的一部分,因此注释必须另起一行。空行在执行过程中会被忽略。

② 等于号(=)符号是被用来定义环境设置的。在这个实例中,它被用来定义 SHELLPATH。如果 SHELL 变量被省略的话,cron 将会使用默认的 Bourne Shell;如果 PATH 被省略的话,当你运行某个程序或脚本时,将必须给定其完整路径。

③ 这一行定义了系统级 crontab 所使用的七个字段(或参数):minutehourmdaymonthwdaywho 以及 command。其中,minute 字段运行指定命令的时间(以分钟为单位),hour 是代表在一日中的第几个小时,mday 是指在一月中的某日,month 是指月份,wday 则是指在一周中的哪一天。这些字段的值必须是数字类型的,且使用 24 小时制。若使用 * 的话,则是指那个字段所包含的所有值,即对该字段下的条件不做限定。who 字段仅在系统级 crontab 中使用,是用来指定运行该命令的用户的。最后一个字段的对应值是你想要运行的程序。

④ 这一行指定了这个 cron 任务的具体细节,即各个参数的对应值。比如,*/5,以及它后面的那四个 *,代表了这个由 root 用户执行的 /usr/libexec/atrun 命令,需要在每月、每周的每天内,每隔五分钟执行一次。命令可以包含任何数目的开关。扩展到多行的命令需要用反斜杠“\”字符断开。

14.3.1.创建用户级的 crontab

要创建一个用户级 crontab,在编辑模式下调用 crontab

% crontab -e

这将使用默认的文本编辑器打开用户的 crontab。用户第一次运行这个命令时,它将打开一个空文件,若用户曾经创建过 crontab,该命令将打开该文件进行编辑。

将这些行添加到 crontab 文件的顶部是很有用的,以便设置环境变量和记录 crontab 中各字段的含义:

SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
# Order of crontab fields
# minute    hour    mday    month   wday    command

然后为每个要运行的命令或脚本添加一行,并在此指定运行该命令的时间。这个例子是每天下午两点运行指定的自定义 Bourne shell 脚本。由于脚本的路径没有在 PATH 中指定,所以我们给出了脚本的完整路径:

0   14  *   *   *   /usr/home/dru/bin/mycustomscript.sh

技巧

在使用自定义脚本之前,请确保它是可执行的,并且用 cron 在设置的有限环境变量下来进行测试。要复制用于运行上述 cron 条目的环境,请使用:

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 作业,使用这个命令:

% crontab -l
0   14  *   *   *   /usr/home/dru/bin/mycustomscript.sh

要删除这个用户级 crontab 中的所有 cron 作业,使用这个命令:

% crontab -r
remove crontab for dru? y