讓Unix環境變量永遠有效

  在Unix操作系統中可以在shell中通過set命令給環境變量賦值。但是如果採用這種方式對環境變量進行賦值的話,當重新啓動操作系統或者重新啓動這個會話的話,原先設置的環境變量就會丟失。也就是說,如果在shell會話中設置環境變量,這隻對當前的會話有效。當系統工程師退出這個會話、下次重新登陸時,操作系統又會採用默認值。但是大部分時候系統工程師可能希望這些環境變量能夠永久生效。此時就需要把這些環境變量定義在啓動腳本中。
  啓動腳本是用戶登錄到Unix操作系統中第一個執行的程序。通常情況下,每個shell都需要有一個啓動腳本,以用來初始化用戶的使用環境。筆者現在就已profile啓動腳本爲例,談談如何通過這個腳本文件讓環境變量永遠有效,以及在配製過程中需要注意的地方。
  一、.profile與profile 的關係。
  通常情況下,在爲每個用戶創建帳號的時候,操作系統會在這個用戶帳號的主目錄下面創建一個啓動腳本(.profile)文件。默認情況下,這個賬戶的環境變量都是保存在這個文件中。也就是說,不同的用戶有不同的啓動腳本,可以設置不同的環境變量。不同用戶之間的環境變量是不共享的。
  但是在/etc目錄下面還有一個profile文件。這個文件跟用戶目錄下的profile文件類似,也是一個啓動腳本,也可以用來保存環境變量的設置。通常情況下,操作系統啓動的時候,是先執行這個腳本文件,然後再去執行用戶目錄下的.profile腳本文件。那麼這兩個啓動腳本文件,對於環境變量的設置有什麼不同呢?在談這個不同之前,大家先來回顧一下在Windows操作系統中設置環境變量的時候,有“用戶環境變量”與“系統環境變量”的區別。在用戶環境變量中設置的環境變量,只對這個用戶有效。而在系統環境變量中設置的環境變量,在對登陸到這個操作系統的所有用戶都有效。其實在Unix操作系統中,這個兩個腳本文件對於環境變量的設置,跟Windows操作系統差不多。在/etc/profile中設置的環境變量,是所有用戶在登陸時都必須採用的環境變量,就相當於Windows操作系統中的系統環境變量,供所有用戶使用。而在用戶主目錄下的profile啓動腳本,則只對當前用戶有效,這相當於Windows操作系統中的用戶環境變量。
  所以在環境變量設置過程中,如果系統工程師認爲所有用戶都需要這個環境變量,那麼就需要在/etc/profile腳本文件中進行設置。相反,如果只有某個特殊的用戶需要使用這個環境變量的話,那麼就只對當前用戶進行設置。如在Unix操作系統上部署Oracle數據庫系統時,往往是創建一個Oracle用戶。然後在這個用戶下部署Oracle操作系統。同時必須給Oracle用戶設置一個$ORACLE_HOME環境變量,否則的話,系統無法正常啓動 Oracle操作系統。此時該在什麼地方設置這個環境變量呢?一般來說,在/etc/profile下設置環境變量的話,也未嘗不可。因爲在這個地方設置環境變量的話,對全體用戶都有效,當然也包括Oracle用戶了。但是這麼操作的話,會導致一個問題。就是各個用戶下跑的應用程序可能會發生相互干擾的情況。而如果只在Oracle用戶下設置$ORACLE_HOME環境變量,那麼對於其他用戶來說是不起作用的。這就可以保障在Unix服務器操作系統上跑的各個應用相對來說是獨立的。
  所以系統工程師在設置環境變量的時候,如果只是個別用戶使用的,那麼最好是在用戶主目錄下的啓動腳本文件中進行設置。只有那些對於全局用戶都有影響的環境變量,纔在/etc/profile腳本文件中進行設置,如採用的語言等等。
  二、特權帳戶臨時需要用到某些環境變量。
  有時候,特權帳戶root在進行某些作業時,可能臨時需要某些帳戶的環境變量。此時該如何處理呢?由於按照第一個規則,這些環境變量可能是設置在用戶主目錄下的腳本文件中,所以對於特權用戶root來說,這些環境變量也是無效的。而現在root賬戶在執行某個作業時,又需要這些環境變量。如就如上面所說,在Unix操作系統上部署了一個Oracle數據庫系統。此時系統工程師需要使用iexpdb工具來備份數據庫系統。爲此系統工程師可能設置了一個備份的腳本程序。系統利用cron命令來週期性的自動執行。可是這個命令必須要在root帳戶下才能夠運行。當在root賬戶下運行這個腳本程序的時候,就會提示一個錯誤信息(提示說找不到這個命令)。可是在Oracle賬戶下執行這個腳本程序命名沒有問題,這到底是什麼原因所造成的呢?原來在這個備份的腳本程序中需要用到iexpdb命令,而這個命令是Oracle數據庫系統所特有的,而不是Unix操作系統的命令。而在root用戶下沒有 Oracle數據庫的環境變量,爲此其就不能夠識別Oracle數據庫系統的下的相關命令。
  遇到這種情況該如何處理呢?在root用戶的主目錄下的profile的配置文件中也設置Oralce數據庫系統的環境變量呢?這個解決方案是可行的,但是卻有一點小題大作。如果在root賬戶目錄下的腳本文件中配置這個環境變量的話,那麼其在從root賬戶登陸開始就會生效。這可能與系統工程師的希望有點遠。系統工程師可能只希望只在備份的會話中這個環境變量有效。而當會話結束時,這個環境變量自動失效。如此的話,仍然可以保持包環境變量的獨立性。這個需求是否可以實現呢?其實筆者現在就是這麼做的。筆者在備份的腳本程序開頭部分,通過set等關鍵字設置了所需要的環境變量。當root 用戶執行這個備份的腳本程序時,會首先這些開頭定義的環境變量設置語句。那麼當執行後面的備份命令時,root用戶就可能設別這個命令。當這個會話結束時,這些環境變量又會自動失效。
  所以說,如果root等特權用戶只有在特定的情況下才使用某些環境變量的時候,雖然在帳戶啓動腳本文件中設置環境變量可以實現。但是這麼做並不是最好的處理方法。通常情況下,筆者建議是在某些需要執行的腳本程序中直接加入設置環境變量的值。這麼做的好處就是保證某些環境變量只對特定的會話有效。當這個會話結束的時候,這些環境變量就會失效。這可以在很大程度上確保環境變量的獨立性。
  三、如何讓配置文件中的環境變量及時有效。
  在談這個話題之前,大家先回顧一下在Windows操作系統中設置環境變量的生效時間。如果系統工程師先打開一個COMMAND命令行窗口,然後再設置這個環境變量。那麼此時這個新設置的環境變量對於剛剛打開的命令行窗口是無效的。此時如果再重新打開一個命令行窗口的話,則這個新設置的環境變量就會生效的。也就是說,新設置的環境變量(用戶環境變量),在不需要重新登陸的情況下,就會生效,只需要重新打開一個命令行窗口即可。
  那麼在Unix操作系統中,這個環境變量的生效時間又是如何呢?一般來說,修改用戶主目錄下的.profile腳本文件,需要先註銷或者重新啓動操作系統,然後再重新登陸纔會有效。不過如果想不退出操作系統就讓其生效的話,那麼只需要在命令行中使用..profile即可,也就是說利用.命令來執行.profile這個配置文件。此時新設置的環境變量在新打開的會話中就會生效。也就是說,在Unix操作系統中環境變量的生效時間跟Unix操作系統下略有不同。前者要對新打開的會話有效的話,必須手工的執行..profile命令才行。而後者的話,只需要重新打開一個命令行窗口新的環境變量即生效。這個差異是大部分系統工程師從Windows向Unix操作系統轉型過程中經常忽視的地方,也是在環境變量配置中最容易犯的錯誤。
  總之,系統工程師可以通過配置啓動腳本讓環境變量永遠生效(每次登錄時操作系統自動初始化)。不過有時候會了考慮環境變量的獨立性,在某些腳本程序中配置環境變量是代替profile腳本文件的一個比較有效的處理方式。因爲其可以保證某些環境變量只在特定的會話中有效。

歡迎訪問:樂園www.ly8.co

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章