Tomcat 自啓動環境參數的設置及 Linux 腳本的啓動順序

問題描述: java

       最近 在作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 中。 固然這都不是 很好的 方式,下面有詳細說明。 linux

問題說明: shell

        1.  Linux 腳本啓動的順序

        能夠參考 文章 http://my.oschina.net/emptytimespace/blog/77968 。 咱們能夠看到 rc.local 腳本的執行順序在 profile 以前。 因此在profile 中設置的 環境參數在 rc.local中沒法使用。 tomcat

       第一步:經過/boot/vm進行啓動 vmlinuz
       第二步:init /etc/inittab
       第三步:啓動相應的腳本,而且打開終端 安全

     rc.sysinit
         rc.d(裏面的腳本)
         rc.local bash

  第四步:啓動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/的符號連接) spa

    rc__.d中__是init.d中腳本的符號連接,命名格式是: 
    S{number}{name} 
    K{number}{name} .net

    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 系列的系統。 腳本文件名稱和路徑稍有變化,請注意。

        若是有錯誤的地方和不完備的地方,請你們補充

相關文章
相關標籤/搜索