Tomcat 自启动环境参数的设置及 Linux 脚本的启动顺序

问题描述:

       最近 在做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 中。 当然这都不是 很好的 方式,下面有详细说明。

问题说明:

        1.  Linux 脚本启动的顺序

        可以参考 文章 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的符号衔接)

      2.  Linux 脚本说明

      有人提到了 也可以在 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 运行的通常二者设置大致相同,所以通常前者会调用后者。

        3. 环境变量的三种方式

         在/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 系列的系统。 脚本文件名称和路径稍有变化,请注意。

        如果有错误的地方和不完备的地方,请大家补充

          


你可能感兴趣的:(tomcat,linux,环境变量)