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 ④
对上述配置文件的解释如下:
① 以 #
开头的部分是注释,可以起到提醒的作用。注释不能和命令放在同一行,否则会被当成命令的一部分,因此注释必须另起一行。空行在执行过程中会被忽略。
② 等于号(=)符号是被用来定义环境设置的。在这个实例中,它被用来定义 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
:
% 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