定时任务

Linux常见的定时任务有两种类型:

  • 一种是一次性的定时任务,只在指定时间执行一次后即销毁
  • 一种是周期性的定时任务,会以指定的周期循环执行

一次性的定时任务对应的命令为at,周期性的定时任务对应的命令为crontab

at

at使用的并不多,格式也较为简单.

at [时间]

例如:

at now + 3 min
warning: commands will be executed using /bin/sh
at> echo helloworld                # 进入at交互式模式,这里输入要执行的命令
at> <EOT>                          # 这里按下键盘的CTRL-D结束输入
job 5 at Wed Jan 13 11:58:00 2016  # 这里列出job的ID以及执行的时间

想一想: 如果要非交互式键入at任务应该怎么办?

  • atq可以列出当前已经定义的job。
  • atrm jobID可以直接删掉已经定义的job
  • at -c jobID可以显示job执行的脚本

crontab

crontab是系统管理员最常用的定时任务,用于周期性的执行某个命令,如检测系统状态,备份数据等等。

crontab需要编写配置文件,写明任务周期执行用户执行的命令 这些参数。

crontab相关的配置文件如下:

  • /etc/crontab: 主配置文件
  • /etc/cron.d/: 辅配置文件, 格式与主配置文件相同
  • /etc/cron.daily/: 每日执行一次的程序
  • /etc/cron.weekly/: 每周执行一次的程序
  • /etc/cron.hourly/: 每小时执行一次的程序
  • /etc/cron.monthly/: 每月执行一次的程序
  • /var/spool/cron/crontabs/$USER: 每个用户单独的定时任务,这个文件里没有 执行用户 这个字段(crontab命令编辑的是这个文件)

/etc/crontab|/etc/cront.d/文件格式像这样:

# m h dom mon dow user    command
17 *    * * *    root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *    root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7    root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *    root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

crontab -e命令会调用编辑器编辑/var/spool/cron/crontabs/$USER这个文件, 和visudo的行为一样,并不会直接编辑目标文件,而是在/tmp/创建一个临时文件编辑, 之后会对格式检测,格式正确才会替换目标文件。

crontab -e的格式像这样(注意没有user字段):

# m h  dom mon dow   command
  * *   *   *   *    echo hello world

TIPS: crontab的非交互式执行:

crontab -l | crontab -

每个时间字段可用的格式:

  • *: 代表本字段所有可用范围
  • m-n: 代表m-n范围
  • n,m, ...: 代表几个不连续的值
  • */n: 指定步长为n*可替换为其他有效范围

常用的crontab格式:

  • * * * * *: 每分钟
  • 0 * * * *: 每小时
  • */2 * * * *: 每2分钟
  • 1-59/2 * * *: 分钟为奇数

TIPS: 一个很不错的在线crontab验证: http://www.atool.org/crontab.php