Linux系統環境信息讀取的順序,ssh執行遠程腳本的坑、gradle遠程部署的坑
問題描述:
1.hadoop集羣一臺一臺的啓動太麻煩了,因此copy個腳本(內容:通過ssh連接每臺服務器,啓動對應的服務),希望在一臺機器上執行腳本,可以將整個集羣啓動、但不幸的是:當前機器是啓動成功的,但其他的機器都是失敗的並且顯示沒有對應的環境變量,很奇怪?
2. 項目中使用到了gradle,裏面通過’org.hidetake.ssh’的插件來編寫gradle task的遠程部署腳本(簡單來說:執行gradle task任務,gradle task裏面的內容是:通過ssh連接服務器,執行shell腳本,自動部署本地項目到服務器),這裏腳本里面需要執行gradle build進行打包,一到這裏就報錯,同樣顯示沒有gradle的環境變量
問題原因:
出現上面兩個問題的關鍵就在於: ssh 的關係
爲什麼?
原來通過ssh執行遠程的命令或者腳本和通過ssh登錄到遠程主機後在執行腳本這兩種方式的bash模式不同。
兩者的不同:
1.登錄Shell:就是你手動使用CRT登錄Linux的時候。此種情形,系統環境信息的讀取順序:/etc/profile、/.bash_profile、/.bash_login、~/.profile
2.非登錄Shell:就是你使用ssh登錄某臺機器的時候。此種情形,系統環境信息的讀取順序:/etc/bash.bashrc、~/.bashrc
我們在配置環境變量的時候,都是/etc/profile下面,所以~/.bashrc下面肯定沒有環境變量了
這裏提一點小意見:最好不要使用root用戶,如果更改root用戶的~/.bashrc裏面的內容,可能會出現別的錯誤
解決辦法:
在每臺服務器上執行:
cat /etc/profile >> ~/.bashrc
source ~/.bashrc