12.3. 配置 cron(8)

FreeBSD 中最有用的工具之一就是 cron。这个工具在后台运行,并定期检查 /etc/crontab 中要执行的任务,并搜索 /var/cron/tabs 中的自定义 crontab 文件。这些文件被用来安排 cron 在指定时间运行的任务。crontab 中的每个条目都定义了一个要运行的任务,被称为 cron job

FreeBSD 使用了两种不同类型的配置文件:系统 crontab 和用户 crontab,其中前者不应该被修改,而后者可以根据需要创建和编辑, 这些文件使用的格式在 crontab(5) 的手册中有记录。需要注意的是,系统 crontab 的格式,即/etc/crontab包括的who列,在用户 crontabs 中不存在。在系统 crontab 中,cron 以该列中指定的用户身份运行命令。在用户 crontab 中,所有命令都以创建 crontab 的用户的身份运行。

用户 crontab 允许单个用户安排他们自己的任务,root 用户也可以有一个用户 crontab,用来安排系统 crontab 中不存在的任务。

如下是一个系统 crontab ,即 /etc/crontab 的示例:

  1. # /etc/crontab - root's crontab for FreeBSD
  2. #
  3. # $FreeBSD$
  4. SHELL=/bin/sh
  5. PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
  6. #
  7. #minute hour mday month wday who command
  8. #
  9. */5 * * * * root /usr/libexec/atrun

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

  1. # 开头的部分是注释,可以起到提醒的作用。注释不能和命令放在同一行,否则会被识别为是命令的一部分,因此注释必须另起一行。空行在执行过程中会被忽略。
  2. = 符号是被用来定义任何环境设置的。在这个实例中,它被用来定义 SHELLPATH 。如果SHELL 变量被忽略的话,cron 将会使用默认的 Bourne Shell;如果 PATH 被忽略的话,当你运行某个程序或脚本时,将必须给定其完整路径。
  3. 这一行定义了系统 crontab 所使用的七个字段(或参数):minute , hour, mday , month , wday , who 以及 command 。其中,minute 字段运行指定命令的时间(以分钟为单位),hour 是代表在一日中的第几个小时,mday 是指在一月中的某一日,month 是指月份,wday 则是指在一周中的哪一天。这些字段的值必须是数字类型的,且使用 24 小时计时法。若使用 * 的话,则是指那个字段所包含的所有值,即对该字段下的条件不做限定。who 字段仅在系统 crontab 中使用,是用来指定运行该命令的用户的。最后一个字段的对应值是你想要运行的程序。
  4. 这一行指定了这个 cron 任务的具体细节,即各个参数的对应值。比如,*/5 ,以及它后面的那四个 * ,代表了这个由 root 用户执行的 /usr/libexec/atrun 命令,需要在每一月、每一周的每一天内,每隔五分钟执行一次。命令可以包含任何数目的开关。扩展到多行的命令需要用反斜杠(\\)字符断开。

13.3.1. 创建一个用户级的 Crontab

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

  1. % crontab -e

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

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

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

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

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

提示

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

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

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

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

  1. % crontab -r
  2. remove crontab for dru? y