目录

Linux 定时任务 crontab 的设置

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 列分钟 1~59
  • 第 2 列小时 1~23(0 表示子夜)
  • 第 3 列日 1~31
  • 第 4 列月 1~12
  • 第 5 列星期 0~6(0 表示星期天)
  • 第 6 列要运行的命令

创建一个新任务

  1. crontab -e打开编辑器对 crontab 文件进行编辑;
  2. 在文件中添加新的一行并保存:
1
2
# 每分钟打印当前时间到 1.log 中
* * * * * date >> 1.log
  1. 使用 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
  • 每晚的 21:30 执行
1
30 21 * * * myCommand
  • 每小时执行
1
2
*/60 * * * * myCommand
0 * * * * myCommand

其他

  • 打开/关闭/重启 crontab 服务:
1
service cron start/stop/restart
1
/etc/init.d/cron start/stop/restart
  • 当 crontab 失效时,可以尝试重启 crontab 服务。
  • 在 crontab 中 % 是有特殊含义的,表示换行的意思。如果要用的话必须进行转义。
  • 更新系统时间时区后需要重启 cron。