## Crontab 格式

### 格式

    Min  Hour Day  Mon  Weekday
    分钟  小时  天   月   周

    *    *    *    *    *  要执行的命令
    ┬    ┬    ┬    ┬    ┬
    │    │    │    │    └─  星期几         (0=周日 .. 6=星期六)
    │    │    │    └──────  月            (1..12)
    │    │    └───────────  月份中的某天    (1..31)
    │    └────────────────  小时           (0..23)
    └─────────────────────  分钟           (0..59)

字段 | 范围 | 特殊字符
--- | --- | ---
分钟 Minute | 0 - 59 | , - * /
小时 Hour | 0 - 23 | , - * /
月份中的某天 | 1 - 31 | , - * ? / L W
月 Month | 1 - 12 | , - * /
星期几 | 0 - 6 | , - * ? / L #

### 示例

Example | Description
--- | ---
`*/15 * * * *` | 每 15 分钟
`0 * * * *` | 每隔一小时
`0 */2 * * *` | 每 2 小时
`15 2 * * *` | 每天凌晨 2 点 15 分
`15 2 * * ?` | 每天凌晨 2 点 15 分
`10 9 * * 5` | 每周五上午 9:10
`0 0 * * 0` | 每个星期日的午夜
`15 2 * * 1L` | 每月最后一个星期一凌晨 2 点 15 分
`15 0 * * 4#2` | 每个月的第二个星期四早上 00:15
`0 0 0 1 * *` | 每个月的 1 日（每月）
`0 0 0 1 1 *` | 每年 1 月 1 日（每年）
`@reboot` | 每次重启 (非标准)

### 特殊字符串

特殊字符串 | 意义
--- | ---
@reboot | 运行一次，在系统启动时 （非标准）
@yearly | 每年运行一次，“0 0 1 1 *” （非标准）
@annually | （与@yearly 相同）（非标准）
@monthly | 每月运行一次，“0 0 1 * *” （非标准）
@weekly | 每周运行一次，“0 0 * * 0” （非标准）
@daily | 每天运行一次，“0 0 * * *” （非标准）
@midnight | （与@daily 相同）（非标准）
@hourly | 每小时运行一次，“0 * * * *” （非标准）

### Crontab 命令

- | -
--- | ---
`crontab -e` | 如果不存在，则编辑或创建一个 crontab 文件。
`crontab -l` | 显示 crontab 文件。
`crontab -r` | 删除 crontab 文件。
`crontab -v` | 显示您上次编辑 crontab 文件的时间。 （非标准）
`echo "@reboot echo hi" | crontab`

### 特殊字符

特殊字符 | 说明
--- | ---
`星号(*)` | 匹配字段中的所有值或任何可能的值。
`横杆(-)` | 用于定义范围。例如：第 5 个字段（星期几）中的 1-5 每个工作日，即星期一到星期五
`斜线 (/)` | 第一个字段（分钟）/15 表示每十五分钟或范围的增量。
`逗号(,)` | 用于分隔项目。例如：第二个字段（小时）中的 2、6、8 在凌晨 2 点、早上 6 点和早上 8 点执行
`L` | 仅允许用于 `月份中的某天` 或 `星期几` 字段，`星期几` 中的 `2L` 表示每个月的最后一个星期二
`井号 (#)` | 仅允许用于 `星期几` 字段，后面必须在 1 到 5 的范围内。例如，`4#1` 表示给定月份的“第一个星期四”。
`问号(?)` | 可以代替“*”并允许用于月份和星期几。使用仅限于 cron 表达式中的 `月份中的某天` 或 `星期几`。

## Also see

- Devhints (devhints.io)
- Crontab Generator (crontab-generator.org)
- Crontab guru (crontab.guru)