OpenWrt任务定时命令Cron详解

Cron软件允许你指定时间来运行你的任务(程序,或者脚本)。OpenWrt默认使用busybox工具箱软件自带的Cron系统功能。

添加和编辑cron定时任务
crontab -e: 这个命令会自动调用“vi”文本编辑器,来打开“/etc/crontabs/root”文件(因为OpenWrt默认的登录用户名是root,某个用户的定时任务配置文件,就放在以它的用户名命名的文件)。

查看当前已经配置的定时任务
crontab -l

删除当前已经配置的定时任务
crontab -r

设置定时任务
* * * * * 需要执行的命令
- - - - -
| | | | |
| | | | ----- 一星期中的第几天 (0 - 6) (其中0表示星期日)
| | | ------- 月份 (1 - 12)
| | --------- 一个月中的第几天 (1 - 31)
| ----------- 一天中的第几小时 (0 - 23)
------------- 一小时中的第几分钟 (0 - 59)

星号(*):代表所有可能的值,如month字段为星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。

逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”

中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”

正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。

例如:

分钟0-59 小时0-23 月内第几天1-31 月份1-12 每周第几天0-6(0表示周日) 效果
* * * * * 每分钟执行一次
*/5 * * * * 每五分钟执行一次
12 */3 * * * 每过3个小时后的第12分钟执行一次
57 11 15 1,6,12 * 在1、6、12月中的15号的11点57分各执行一次
25 6 * * 1-5 工作日期间(周1到周5),每天早上6点25分执行一次
0 0 4,12,26 * * 每月的第4、12、26日,晚上12点执行一次
日志
logread -e cron
读取cron软件执行的记录,不是所有信息都会被记录到日志里的,在/etc/config/system修改 cronloglevel的值修改,信息等级。默认为5,0将打印所有调试消息,8将记录命令执行,9或更高版本将仅记录错误消息。

定时重启
用来对付一些系统运行时出现的难题(比如内存泄露、性能下降、……)的法宝就是每晚定期重启。
有可能会出现反复重启问题:
一种解决cron定时重启任务的怪圈的办法是在重启前,推迟一会儿重启,同时主动用touch命令去修改/etc下的任意文件。

# 每天上午4:30执行重启
# 注意: 为了防止循环重启的怪圈,需要推迟70秒钟执行重启
# 在/etc目录下touch修改一个文件的时间属性,并且设置
# 为上午4:31然后再执行cron的重启任务.
30 4 * * * sleep 70 && touch /etc/banner && reboot

注意:如果出现脚本或者命令未执行,情况可能是环境变量问题。

在crontab文件中定义多个调度任务时,需要特别注意的一个问题就是环境变量的设置,因为我们手动执行某个脚本时,是在当前shell环境下进行的,程序能找到环境变量;而系统自动执行任务调度时,除了默认的环境,是不会加载任何其他环境变量的。因此就需要在crontab文件中指定任务运行所需的所有环境变量。
 不要假定cron知道所需要的特殊环境,它其实并不知道。所以用户要保证在shell脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。以下三点需要注意:

1. 脚本中涉及文件路径时写绝对路径;

2. 脚本执行要用到环境变量时,通过source命令显式引入,例如:

#!/bin/sh
source /etc/profile

3. 当手动执行脚本没问题,但是crontab不执行时,可以尝试在crontab中直接引入环境变量解决问题,例如:

* * * * * . /etc/profile; /xx/xx/test.sh

好了,这个问题就这样解决了,反正是加上环境变量没错的。

原文地址:
https://blog.csdn.net/hzlarm/article/details/103008792

Related Posts