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 文件的格式

Each significant line of a crontab describes a scheduled command with the six (or seven) following fields:
  • 分钟值(从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 文件

#格式
#分钟 小时 天 月份 星期 命令

# 每天晚上七点二十五分下载数据
 25  19   *   *   *    $HOME/bin/get.pl

# 周内每天早上八点(周一至周五)
 00  08   *   *   1-5  $HOME/bin/dosomething

# 每次重启后启动 IRC 代理
@reboot /usr/bin/dircproxy

9.7.2. 使用 at 命令

The at executes a command at a specified moment in the future. It takes the desired time and date as command-line parameters, and the command to be executed in its standard input. The command will be executed as if it had been entered in the current shell. at even takes care to retain the current environment, in order to reproduce the same conditions when it executes the command. The time is indicated by following the usual conventions: 16:12 or 4:12pm represents 4:12 pm. The date can be specified in several European and Western formats, including DD.MM.YY (27.07.15 thus representing 27 July 2015), YYYY-MM-DD (this same date being expressed as 2015-07-27), MM/DD/[CC]YY (ie., 12/25/15 or 12/25/2015 will be December 25, 2015), or simple MMDD[CC]YY (so that 122515 or 12252015 will, likewise, represent December 25, 2015). Without it, the command will be executed as soon as the clock reaches the time indicated (the same day, or tomorrow if that time has already passed on the same day). You can also simply write “today” or “tomorrow”, which is self-explanatory.
$ at 09:00 27.07.15 <<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 Mon Jul 27 09:00:00 2015
另外一种方法可以向后推迟一段时间执行命令:at now + 数字 间隔间隔 可以是 分钟, 小时, , 或者 星期数字 指明在命令执行之前消逝时间的单位数量。
要取消 cron中的计划任务,运行 crontab -e 删除 crontab 文件中的对应行。对于使用 at 命令的任务,同样简单:运行 atrm 任务编号。任务编号在调度时有 at 命令指定,可以通过 atq 命令查询找到,该命令给出当前计划任务清单。