OpenWrt 计划任务使用方法

在 Linux 中重启定时任务:crontab 命令详解

/etc/init.d/cron stop
/etc/init.d/cron start
/etc/init.d/cron restart

如何设置每天凌晨2点自动重启

想要让设备在每天凌晨2点自动重启,可以按以下步骤操作:

  1. 通过 crontab -e 命令编辑计划任务。
  2. 在打开的文本中添加一行:0 2 * * * /sbin/reboot
  3. 保存并退出(通常是按 Ctrl+X,然后按 Y 确认)。

计划任务(Cron)是 Unix 及类 Unix 系统中用于设置周期性执行命令的常用功能。

每个计划任务都存储在 crontab 文件中。在标准的 Linux 系统中,每个用户都有自己的 crontab 文件,同时还有一个系统级的 crontab 文件。但在 OpenWrt 中,通常只有一个系统级的 crontab 文件,其路径为 /etc/crontabs/root

crontab 文件中,每一行代表一个任务。每个任务由“执行时间”和“执行命令”两部分组成。执行时间又细分为五个字段:分钟、小时、日期、月份、星期,各字段之间以空格分隔。

对于刚接触 OpenWrt 或 Linux 的朋友来说,可能不太清楚计划任务的具体用途。经常有朋友问我:“小山,能不能给固件加个定时重启功能?” 我通常会回答:“直接在计划任务里添加就行。” 而得到的回复往往是:“怎么用啊?”

这让我有些无奈,所以这篇文章就来详细讲解一下计划任务的使用方法。

计划任务语法

如前所述,crontab 文件中的每一行对应一个任务指令,该指令由执行时间和执行命令组成。那么,这个指令具体该怎么写呢?

一个完整的任务指令包含6个部分,按顺序分别是:分钟小时日期月份星期要执行的命令

时间参数范围

  • 分钟:0 – 59
  • 小时:0 – 23
  • 日期:1 – 31
  • 月份:1 – 12
  • 星期:0 – 7 (其中 0 和 7 都代表星期日)

除了直接指定具体数值,还可以使用一些特殊符号来定义更灵活的时间规则:

  • 逗号 ( , ):用于分隔多个值。
  • 连字符 ( – ):用于指定一个连续的范围。
  • 星号 ( * ):代表“任何值”,可以理解为通配符。
  • 斜杠 ( / ):通常与星号搭配使用,用于指定间隔频率。下面会举例说明。

示例 1:0 6 * * * reboot
这个任务会在每天6点0分执行 reboot 命令。因为“日期”、“月份”、“星期”字段都是星号(通配符),所以只要当前时间是6点0分,无论几月几日、星期几,都会触发执行。

示例 2:0 6 * * 1,3 reboot
这个任务会在每周一和周三6点0分执行 reboot 命令。逗号用于分隔多个值(1代表周一,3代表周三)。因此,只有在周一或周三的6点0分才会执行,同样不关心具体的日期和月份。

示例 3:0 6 * 3-6 1,3 reboot
这个任务会在三月到六月期间(月份字段 3-6 表示范围),每周一和周三6点0分执行 reboot 命令。当然,也可以写成 0 6 * 3,4,5,6 1,3 reboot,但使用连字符更加简洁。

示例 4:0 */3 * * * reboot
斜杠 (/) 用于指定跳过某些值的间隔。可以把它理解为一个除法运算,当结果恰好为整数时,条件满足。在这个例子中,小时字段写成了 */3,表示“每3小时”。因此,任务会在0点、3点、6点、9点……这些能被3整除的小时的第0分钟执行。例如,1点(1/3不是整数)不会执行,而9点(9/3=3)会执行。

示例 5:*/10 */3 * * * reboot
这个例子中,分钟和小时字段都使用了斜杠。它表示任务会在分钟数能被10整除(即每10分钟,如0分、10分、20分…),且小时数能被3整除(即0点、3点、6点…)的时刻执行。例如,1点10分虽然分钟满足,但小时不满足;而3点40分则同时满足两个条件,会触发执行。

可能有人会问:在 OpenWrt 里,计划任务到底在哪里编写呢?很简单:登录 OpenWrt 的网页管理界面 → 进入“系统”菜单 → 点击“计划任务”即可。界面如下图所示:

(此处应有计划任务配置界面截图)

计划任务注意事项

  1. 关于重启任务的正确写法
    前面例子中直接写 0 6 * * * reboot 来定时重启设备,其实是一种不推荐的做法。更稳妥的写法是:0 6 * * * sleep 60 && reboot
    原因:设备重启后,计划任务的守护进程(cron daemon)会随之启动,并立即检查当前是否有任务需要执行。如果设备从启动到 cron 守护进程就绪的时间小于1分钟(通常如此),那么系统时间一旦匹配到重启任务(例如6点0分),就会立刻再次触发重启,形成循环。通过 sleep 60 命令延迟60秒再执行 reboot,可以有效地避免这种意外。

  2. 日期与星期的逻辑关系
    当“日期”和“星期”字段同时被设置为具体数值(而非通配符 *)时,只要其中一个条件被满足,任务就会被执行,而不需要两个条件同时满足。(实际上,要求日期和星期都精确匹配的苛刻条件,在现实中很少用到。)

  3. 命令中百分号 (%) 的转义
    在计划任务的命令部分,如果使用双引号并需要包含百分号 %,必须在其前面加上反斜杠 \ 进行转义。

    • 错误示例0 6 * * * touch /tmp/$(date “%Y”)
    • 正确示例0 6 * * * touch /tmp/$(date “\%Y”)

Q.E.D.


生命在于折腾