问题描述:
最近 在做Tomcat优化(Tomcat 字符编码,Apr & Tomcat-Native安装) 时,遇到一个自启动环境参数的问题。
本次优化需要设置:
export LC_ALL=en_US.UTF-8
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib 这两个Tomcat 的环境参数,最初设置在/etc/default/locale 和 etc/profile 文件末尾,和Java 环境变量在一起, 手动启动Tomcat 都能生效。 当 tomcat 在 /etc/rc.local 下设置为 自动时,环境变量不能生效。
最后在 又在/etc/rc.local 文件中 Tomcat 自启动命令设置之前 再次设置 这两个环境参数优化才生效。也可以将这两个环境参数 和 java环境变量 设置在 Tomcat 的启动脚本 catalina.sh 中。 当然这都不是 很好的 方式,下面有详细说明。
问题说明:
可以参考 文章 http://my.oschina.net/emptytimespace/blog/77968 。 我们可以看到 rc.local 脚本的执行顺序在 profile 之前。 所以在profile 中设置的 环境参数在 rc.local中无法使用。
第一步:通过/boot/vm进行启动 vmlinuz
第二步:init /etc/inittab
第三步:启动相应的脚本,并且打开终端
rc.sysinit
rc.d(里面的脚本)
rc.local
第四步:启动login登录界面 login
第五步:在用户登录的时候执行sh脚本的顺序:每次登录的时候都会完全执行的
/etc/profile.d/file
/etc/profile
/etc/bashrc
/root/.bashrc
/root/.bash_profile
1, init是所有过程的顶层,init读取/etc/inittab配置
2, init调用执行/etc/inittab配置的/etc/rc.d/rc.sysinit脚本
3, rc.sysinit按照inittab执行/etc/rc__.d/目录下的各个脚本
4,大多数启动脚本搁置在 /etc/rc.d/init.d下(/etc/init.d是到/etc/rc.d/init.d/的符号链接)
rc__.d中__是init.d中脚本的符号链接,命名格式是:
S{number}{name}
K{number}{name}
S末尾的文件向脚本传递start参数
K末尾的文件向脚本传递stop参数
number决议执行的步伐
其中有文件:S99local 为 ../rc.local(即/etc/rc.d/rc.local的符号衔接)
有人提到了 也可以在 etc/enviroment 中设置 环境变量。 这里我们可以看下 环境参数脚本启动顺序(Debian):
/etc/environment -> /etc/profile -> (~/.bash_profile | ~/.bash_login | ~/.profile) -> ~/.bashrc -> /etc/bashrc -> ~/.bash_logout 。可以参考 文章 http://my.opera.com/lsds/blog/linux
这里的启动顺序是指系统启动顺序,只加载一次。用户登录时环境变量加载顺序为 :
/etc/profile => [/etc/environment] => (~/.bash_profile | ~/.bash_login | ~/.profile) => ~/.bashrc => (/etc/bash.bashrc | /etc/bashrc) => ~/.bash_logout。
(1)/etc/environment:此配置文件设置基本的PATH变量,及系统当前语言变量,虽然比较短,但却在系统启动中占据举足轻重的作用,提倡用于设置全局环境变量,仅debain系列发行版(如Ubuntu)才有。
(2)/etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 并从/etc/profile.d目录的配置文件中搜集shell的设置。
(3)/etc/bash.bashrc: 为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取。Redhat系列发行版是bashrc,Debian系列发行版是bash.bashrc。
(4)~/.bash_profile: 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。
(5)~/.bashrc: 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。
(6)~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件. 另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承 /etc/profile中的变量,他们是"父子"关系。
(7)~/.bash_profile 是交互式、login 方式进入 bash 运行的~/.bashrc 是交互式 non-login 方式进入 bash 运行的通常二者设置大致相同,所以通常前者会调用后者。
在/etc/profile中设置,这是全局的, 需要重新登录,或者 执行source /etc/profile生效。
在用户目录下的 ~/.bashrc 中设置,这是针对单个用户的,需要重新登录生效。
直接在shell 终端下,使用shell命令设置,针对当前终端的,关闭shell终端后,失效。
综上: rc.local 是以UID 0的身份运行的,这里指内核启动,爆发在登录之前。因此用户登录不能继承这里所设置的环境变量,所以需要在/etc/profile设置。rc.local 是系统初始化的最后一步,然后才是加载用户环境参数。
etc/enviroment 是系统环境变量。 etc/profile 是用户环境变量。 如果两者重复,以etc/profile 为准。这两个设置后,对所有用户都有效。
设置环境变量注意:1.采用 冒号 “:” 分隔Linux 路径;2.$PATH / $CLASSPATH / $JAVA_HOME 是用来引用原来的环境变量的值,export 时不能覆盖;3. 注意CLASSPATH中的当前目录“.”;4.需要用export命令导出为全局变量;5. 严格区分大小写。
解决方案:
1. 不能在rc.local中设置环境变量,用户无法继承
2. 不能只在 profile中设置,这样 rc.local 中自启动的程序无法获取 环境变量。同时针对所有用户,生产中有安全问题
3. 不建议只在 Tomcat 启动脚本中设置,这样其他程序无法复用
推荐方案:
1. 编写Tomcat 自启动shell 脚本,脚本中 设置 Tomcat 需要的 环境变量,同时启动 Tomcat
2. 在rc.local 中执行 在第一步 中编写的脚本。
3. 在指定用户主目录下 的 .bashrc 文件中 设置用户 Java 环境变量,当用户每次登陆时加载 或者当前用户下执行 shell 时也会加载
注: 这里针对的Linux 系统适用于 redhat 和 debian 系列的系统。 脚本文件名称和路径稍有变化,请注意。
如果有错误的地方和不完备的地方,请大家补充