Product SiteDocumentation Site

9.7. 使用 cronatd运行计划任务

cron 是负责调度和运行周期命令(每天,每周,等)的守护进程; atd 用于处理单次执行命令,命令将在未来某个指定时刻运行。
在Unix 系统,许多任务都被周期性的调度:
默认情况下,所有用户都可以运行计划任务。每个用户有他们自己的 crontab 其中记录了要调度的命令。可以运行 crontab -e 编辑(其内容存储在 /var/spool/cron/crontabs/user 文件中)。
超级用户有自己的 crontab,但是也可以使用 /etc/crontab 文件,或者在 /etc/cron.d 目录中写入另外的crontab 文件。这两种方法可以用来指明执行命令时的用户身份。
cron 软件包默认包含一些可执行的调度命令:
Many Debian packages rely on this service: by putting maintenance scripts in these directories, they ensure optimal operation of their services.

9.7.1.  crontab 文件的格式

crontab 每个单独行使用六(或7)个区段描述一个调度任务:
  • 分钟值(从0到59);
  • 小时(从0到23);
  • 每月的日期值(从1到31);
  • 月份值(从1到12);
  • 星期值(从0到7,1对应星期一,0和7都代表星期日;也可以使用星期英文表示单次的前三个字母,例如 SunMon,等);
  • 命令将以哪个用户的名义执行(在文件 /etc/crontab/etc/cron.d/中,而不是在用户自己的调度文件中);
  • 要执行的命令(当满足前面5栏定义的条件时)。
全部的细节记录在 crontab(5) 手册中。
每个值可以表示为所有可能值的列表(使用逗号分隔)。语法a-b 描述介于 ab中间的所有值。语法 a-b/c 描述以c 为增量间隔(例如: 0-10/2 代表 0,2,4,6,8,10)。星号 * 是通配符,代表所有可能值。

例 9.2. 示例 crontab 文件

#Format
#min hour day mon dow  command

# Download data every night at 7:25 pm
 25  19   *   *   *    $HOME/bin/get.pl

# 8:00 am, on weekdays (Monday through Friday)
 00  08   *   *   1-5  $HOME/bin/dosomething

# Restart the IRC proxy after each reboot
@reboot /usr/bin/dircproxy

9.7.2. 使用 at 命令

at 执行在未来某一时刻指定的命令。它将预定的时间和日期作为命令行参数,带上要执行的命令作为标准输入。如果进入当前的命令介面(shell),命令就会执行。 at 命令甚至会保存当前的环境,以便重建执行命令时的条件。时间使用下面的方法标记: 16:12 或者 4:12pm 代表 4:12 pm。日期可以用几种欧式和西式方法表示: DD.MM.YY27.07.12 表示2012年7月27号),YYYY-MM-DD (相同的日期用 2012-07-27表示),MM/DD/[CC]YY (例, 12/25/12 或者 12/25/2012 就是2012年12月25号),或者简单点 MMDD[CC]YY122512 或者 12252012 类似地,也表示2012年12月25号)。如果没有日期选项,一旦到达标记时间(当天,如果已经过了当天的设定时间,就改在明天),命令就会运行。也可以使用“today”或者“tomorrow”来明确的指示今天或者明天。
$ at 09:00 27.07.14 <<END
> echo "Don't forget to wish a Happy Birthday to Raphaël!" \
>   | mail lolando@debian.org
> END
warning: commands will be executed using /bin/sh
job 31 at Fri Jul 27 09:00:00 2012
另外一种方法可以向后推迟一段时间执行命令:at now + 数字 间隔间隔 可以是 分钟, 小时, , 或者 星期数字 指明在命令执行之前消逝时间的单位数量。
要取消 cron中的计划任务,运行 crontab -e 删除 crontab 文件中的对应行。对于使用 at 命令的任务,同样简单:运行 atrm 任务编号。任务编号在调度时有 at 命令指定,可以通过 atq 命令查询找到,该命令给出当前计划任务清单。