Linux的crontab用法简介

本文简要介绍Linux中的定期执行程序crontab命令。

语法介绍

crontab的语法如下:

1
2
usage: crontab [-u user] file
crontab [-u user] { -e | -l | -r }

其中-u可以让你设定某个用户的定期执行日程。其余三个选项的作用为:

1
2
3
4
5
6
# 列出目前的crontab日程
crontab -l
# 使用系统的文本编辑器来打开crontab日程表,可进行增删改
crontab -e
# 删除目前的crontab日程
crontab -r

新建crontab任务

除了使用crontab命令来新建任务之外,一般可以使用如下格式:

1
2
# crontab format
[MIN] [HOUR] [DOM] [MON] [DOW] [CMD]

对于以上crontab格式的解释如下:

  • [MIN]代表分钟,可以取0-59。
  • [HOUR]代表小时,可以取0-23。
  • [DOM]代表日期,可以取1-31。
  • [MON]代表月份,可以取1-12(或者JAN-DEC)。
  • [DOW]代表星期几,可以取0-6(或者SUN-SAT;一般用0代表周日,但有时候也可以用7来代表周日)。
  • [CMD]代表最后需要定期运行的命令。

此外还有几种特殊符号:

  • *代表任意值,比如在日期处输入*就代表每日都要执行一次。
  • /代表间隔值,比如在分钟处输入*/5就代表每5分钟就要执行一次。
  • -代表时间段,比如在分钟处输入0-19就代表0-19分钟里每分钟都要执行一次。
  • ,代表分隔,比如在分钟处输入3,5就代表在当分钟在3分和5分时各执行一次。

以上还可以任意组合,例如:

  • 1-10/2,15在分钟处表示在1-10分钟内每两分钟执行一次,并且15分钟时单独执行一次。
  • */6,15在分钟处表示每6分钟执行一次,并且15分钟时单独执行一次。

此外,还有一些特殊关键字可以代替[MIN] [HOUR] [DOM] [MON] [DOW]

  • @yearly@annually表示0 0 1 1 *,即每年1月1日的00:00执行。
  • @monthly表示0 0 1 * *,即每月1日的00:00执行。
  • @weekly表示0 0 * * 0,即每周日00:00执行。
  • @daily表示0 0 * * *,即每天00:00执行。
  • @hourly表示0 * * * *,即每小时0分执行。
  • @reboot代表开机时执行。

应用举例

1) 每分钟打印一次meow

1
* * * * * echo "meow"

这里的「每分钟」是指:每年每个月每天每小时的每分钟,所以用了5个*

如要在每日零点的每分钟,则可以使用* 0 * * *。每月第一天的零点的每分钟,可以使用* 0 1 * *

2) 每天00:00执行一次ls

1
2
3
0 0 * * * ls
# alternative
@daily ls

3) 更多举例:
接下来的例子只举例时间,不举例具体命令:

  • 5 0 * 8 *:每年8月份的00:05。
  • 0 22 * * 1-5:每周一到周五的22:00。
  • 23 0-20/2 * * *:每天0-20时中,每两小时的23分。
  • 0 0,12 1 */2 *:每两个月的第一天中的00:00与12:00。

推荐一个网站:crontab guru。在这里你可以测试你的crontab日程是否符合预期。