Unix/Linux Crontab用法

在Unix/Linux中,crontab一直是作为定时执行计划任务的一个非常有效的工具。在系统维护和数据分析方面扮演一个很重要的角色。

要查看当前用户下的job,可以使用下面的命令。

crontab -l

如果要修改计划任务就使用下面的命令。

crontab -e

在很多系统上默认会调用vi/vim来修改任务列表。如果想修改默认的编辑器,可以使用类似下面的命令。

export EDITOR="pico"

当然可以将此命令加到开机启动列表中。编辑器打来的列表想下面的样子。

* * * * * /usr/bin/mutt -s "test" imxylz@imxylz.info < /tmp/logfile

在上面的列表中我们一种有6个字段。其中每一个*代表一个时间字段,是用来调度用的。后面一连串的命令当作一条执行语句,是一个可执行程序(当然运行带参数了)。

下面重点说说这五个*的意思。

  1. minute (from 0 to 59)
  2. hour (from 0 to 23)
  3. day of month (from 1 to 31)
  4. month (from 1 to 12)
  5. day of week (from 0 to 6) (特别注意0代表的是星期日)

*代表的是任意时间。因此上面的命令代表的意思是任意月的任意星期任意天任意小时任意分钟都发送一封邮件,简单说就是每隔一分钟执行一次。注意因为最小单位只有分,因此只能控制到分的粒度。

举个例子,如果想在每周日的晚上23点30分执行一条命令。可以这么写。

30 23 * * 0 /bin/doit.sh

上面五个字段的意思是:

  1. 30分执行
  2. 23点执行
  3. 一个月中的任意一天
  4. 任意月
  5. 只在星期日执行

综合起来的意思就是在每周日的晚上23点30分执行。

描述重复还可以使用范围,比如下面的例子是工作日的早上9点做一些事。

0 9 * * 1-5 /bin/dosomething.sh

除了可以使用范围还可以描述多个点,比如上面的例子可以用下面等价的点来描述。

0 9 * * 1,2,3,4,5 /bin/dosomething.sh

还有一种描述周期性的任务,比如工作日上班时间(9点~17点)每半个小时提醒喝水一次。

*/30 9-17 * * 1-5 /bin/drinkwater
  1. 每30分执行一次,比如0分,30分。
  2. 9点至17点之间
  3. 一个月的任意一天
  4. 任意月份
  5. 只在周一至周五

还可以使用一些默认的单词来替代五个参数。比如

@hourly /bin/drinkwater

每一个小时提醒喝水一次,包括下班时间和非工作日。可以使用的单词如下:

@yearly 每年运行一次,相当于"0 0 1 1 *"
@annually 每年运行一次,同@yearly
@monthly 每月运行一次,相当于"0 0 1 * *"
@weekly 每周运行一次,相当于"0 0 * * 0"
@daily 每日运行一次,相当于"0 0 * * *"
@midnight 每日运行一次,同@daily
@hourly 每小时运行一次,相当于"0 * * * *"

如果crontab有输出的话(包括错误输出),默认情况下会将记录保存在运行用户的maill目录中,可以使用mutt查看。前面说过脚本可以带参数,因此就可以重定向输出。比如下面的脚本将stdout和stderr合并输出到/tmp/log.txt文件中。

*/30 * * * * /bin/dosomething.sh 2>&1 >> /tmp/log.txt

大体上就这么多,这些格式应该基本上够用了。