問題描述: 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
能夠參考 文章 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的符號銜接)
有人提到了 也能夠在 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 系列的系統。 腳本文件名稱和路徑稍有變化,請注意。
若是有錯誤的地方和不完備的地方,請你們補充