crontab 命令格式和参数
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 列分钟 0~59
- 第 2 列小时 0~23(0 表示子夜)
- 第 3 列日 1~31
- 第 4 列月 1~12
- 第 5 列星期 0~6(0 表示星期天)
- 第 6 列要运行的命令
创建一个新任务
- 使用
crontab -e
打开编辑器对 crontab 文件进行编辑; - 在文件中添加新的一行并保存:
# 每分钟打印当前时间到 1.log 中
* * * * * date >> 1.log
- 使用
crontab -l
查看文件内容,发现该定时任务已被写入。任务应该可以正常执行了。
注意事项
执行环境变量
如果是执行自己写的脚本或程序,要确保在 shell 脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。
有时我们创建了一个 crontab,但这个任务无法自动执行,而手动执行却没有问题。这种情况一般是由于 crontab 文件中没有配置环境变量引起的。因为手动执行时是在当前 shell 环境下进行的,程序能找到环境变量;而系统自动执行任务调度时,环境不同,许多变量需要手动设置。
解决方案:
- 脚本中涉及文件路径时写全局路径;
- 脚本执行需要用到 Java 或其他环境变量时,通过 source 命令引入环境变量,如:
#!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
- 当手动执行脚本正常,但 crontab 死活不执行时,很可能是环境变量惹的祸。可尝试在 crontab 中直接引入环境变量解决问题。如:
0 * * * * . /etc/profile;/bin/sh /home/pi/myscripts.sh
用户邮件日志
每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件发送给当前系统用户。这样日积月累,日志信息会非常大,可能会影响系统的正常运行。因此,将每条任务进行重定向处理非常重要。例如,可以在 crontab 文件中设置如下形式,忽略日志输出:
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 分钟执行
3,15 8-11 */2 * * myCommand
- 每周一上午 8 点到 11 点的第 3 和第 15 分钟执行
3,15 8-11 * * 1 myCommand
- 每晚的 21:30 执行
30 21 * * * myCommand
- 每小时执行
*/60 * * * * myCommand
0 * * * * myCommand
其他
- 打开/关闭/重启 crontab 服务:
service cron start/stop/restart
/etc/init.d/cron start/stop/restart
- 当 crontab 失效时,可以尝试重启 crontab 服务。
- 在 crontab 中
%
是有特殊含义的,表示换行的意思。如果要用的话必须进行转义。 - 更新系统时间时区后需要重启 cron。