crontab 命令格式和参数
1
2
3
4
5
| crontab [ -u user ] [ -i ] { -e | -l | -r }
-e (edit user's crontab) 编辑某个用户的 crontab 文件内容
-l (list user's crontab) 显示某个用户的 crontab 文件内容
-r (delete user's crontab) 删除某个用户的 crontab 文件内容
-i (prompt before deleting user's crontab) 与-r 配合,删除前提示
|
crontab 的文件格式
- 第 1 列分钟 1~59
- 第 2 列小时 1~23(0 表示子夜)
- 第 3 列日 1~31
- 第 4 列月 1~12
- 第 5 列星期 0~6(0 表示星期天)
- 第 6 列要运行的命令
创建一个新任务
crontab -e
打开编辑器对 crontab 文件进行编辑;- 在文件中添加新的一行并保存:
1
2
| # 每分钟打印当前时间到 1.log 中
* * * * * date >> 1.log
|
- 使用
crontab -l
查看文件内容,发现该定时任务已被写入。任务应该可以正常执行了。
注意事项
执行环境变量
如果是执行自己写的脚本或者程序,要保证在 shell 脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。
有时我们创建了一个 crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在 crontab 文件中没有配置环境变量引起的。因为我们手动执行某个任务时,是在当前 shell 环境下进行的,程序当然能找到环境变量;而系统自动执行任务调度时,跟 shell 所在环境不同,许多环境变量需要手动设置。
解决方案:
- 脚本中涉及文件路径时写全局路径;
- 脚本执行要用到 java 或其他环境变量时,通过 source 命令引入环境变量,如:
1
2
3
| !/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
|
- 当手动执行脚本 OK,但是 crontab 死活不执行时,很可能是环境变量惹的祸,可尝试在 crontab 中直接引入环境变量解决问题。如:
1
| 0 * * * * . /etc/profile;/bin/sh /home/pi/myscripts.sh
|
用户邮件日志
每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。 例如,可以在 crontab 文件中设置如下形式,忽略日志输出:
1
| 0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1
|
“/dev/null 2>&1” 表示先将标准输出重定向到/dev/null
,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null
,因此标准错误也会重定向到/dev/null
,这样日志输出问题就解决了。
系统级任务调度与用户级任务调度
系统级任务调度主要完成系统的一些维护操作,用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议这么做),但是反过来却不行,root 用户的任务调度操作可以通过crontab –u root –e
来设置,也可以将调度任务直接写入/etc/crontab 文件,需要注意的是,如果要定义一个定时重启系统的任务,就必须将任务放到/etc/crontab 文件,即使在 root 用户下创建一个定时重启系统的任务也是无效的。
常见使用实例
- 每隔两天的上午 8 点到 11 点的第 3 和第 15 分钟执行
1
| 3,15 8-11 */2 * * myCommand
|
- 每周一上午 8 点到 11 点的第 3 和第 15 分钟执行
1
| 3,15 8-11 * * 1 myCommand
|
1
2
| */60 * * * * myCommand
0 * * * * myCommand
|
其他
1
| service cron start/stop/restart
|
1
| /etc/init.d/cron start/stop/restart
|
- 当 crontab 失效时,可以尝试重启 crontab 服务。
- 在 crontab 中
%
是有特殊含义的,表示换行的意思。如果要用的话必须进行转义。 - 更新系统时间时区后需要重启 cron。