OpenWrt 计划任务使用方法
在 Linux 中重启定时任务:crontab 命令详解
/etc/init.d/cron stop
/etc/init.d/cron start
/etc/init.d/cron restart
如何设置每天凌晨2点自动重启
想要让设备在每天凌晨2点自动重启,可以按以下步骤操作:
- 通过
crontab -e命令编辑计划任务。 - 在打开的文本中添加一行:
0 2 * * * /sbin/reboot。 - 保存并退出(通常是按
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 的网页管理界面 → 进入“系统”菜单 → 点击“计划任务”即可。界面如下图所示:
(此处应有计划任务配置界面截图)
计划任务注意事项
-
关于重启任务的正确写法
前面例子中直接写0 6 * * * reboot来定时重启设备,其实是一种不推荐的做法。更稳妥的写法是:0 6 * * * sleep 60 && reboot。
原因:设备重启后,计划任务的守护进程(cron daemon)会随之启动,并立即检查当前是否有任务需要执行。如果设备从启动到 cron 守护进程就绪的时间小于1分钟(通常如此),那么系统时间一旦匹配到重启任务(例如6点0分),就会立刻再次触发重启,形成循环。通过sleep 60命令延迟60秒再执行reboot,可以有效地避免这种意外。 -
日期与星期的逻辑关系
当“日期”和“星期”字段同时被设置为具体数值(而非通配符 *)时,只要其中一个条件被满足,任务就会被执行,而不需要两个条件同时满足。(实际上,要求日期和星期都精确匹配的苛刻条件,在现实中很少用到。) -
命令中百分号 (%) 的转义
在计划任务的命令部分,如果使用双引号并需要包含百分号%,必须在其前面加上反斜杠\进行转义。- 错误示例:
0 6 * * * touch /tmp/$(date “%Y”) - 正确示例:
0 6 * * * touch /tmp/$(date “\%Y”)
- 错误示例:
Q.E.D.


