/etc/profile與/etc/bashrc、互動式與非互動式、login與non-login shell的區別,bashrcnon-login

來源:互聯網
上載者:User

/etc/profile與/etc/bashrc、互動式與非互動式、login與non-login shell的區別,bashrcnon-login
線上的memcached又掛了,仍然沒有得到core檔案。排查原因,同事發現啟動memcached的指令碼存在可疑問題。問題一:沒有設定memcached工作目錄,有可能core dump時沒有工作目錄寫入權限這些指令碼由crontab啟動。指令碼中沒有設定工作目錄,而這是非root使用者的crontab。啟動memcached時,工作目錄不是memcached可執行檔所在目錄。實驗證明,這個是使用者的home目錄,crontab啟動並執行指令碼中列印pwd,結果是"home/work",work是目前使用者。問題二:在/etc/profile中設定的ulimit -c unlimited對crontab的指令碼是無效的
在查閱相關資料後得知,/etc/profile中的設定只對Login Shell生效,而crontab運行指令碼的shell環境是non-login的,不會載入/etc/profile的設定。
在這裡,需要總結一下/etc/profile與/etc/bashrc的區別,以及互動式與非互動式、login與non-login shell概念的區別。
熟悉Linux的程式員應該有過在~/.profile檔案中設定環境變數的經驗,在~/.profile設定的環境變數只會對那一個使用者有效,而如果要對全部的使用者有效,則要設定/etc/profile。/etc/profile就是~/.profile的全域版本。事實上,一旦開啟一個互動式login shell,或者以--login選項登入的非互動式shell,都會首先載入並執行/etc/profile中的命令,然後再依次載入~/.bash_profile, ~/.bash_login, 和~/.profile中的命令。
這裡又涉及到互動式shell與非互動式shell,login shell與non-login shell的概念。按照這兩個維度劃分,那麼共有四種shell:互動式login shell,互動式非login shell,非互動式login shell,非互動式非login shell。

互動:顧名思義,這種shell中的命令時由使用者從鍵盤互動式地輸入的,啟動並執行結果也能夠輸出到終端顯示給使用者看。

非互動:這種shell可能由某些自動化過程啟動,不能直接從請求使用者的輸入,也不能直接輸出結果給終端使用者看。輸出最好寫到檔案。

login的:意思是這種是在某使用者由/bin/login登陸進系統後啟動的shell,跟這個使用者綁定。這個shell是使用者登陸後啟動的第一個進程。login進程在啟動shell時傳遞第0個參數指明shell的名字,該參數第一個字元為"-",指明這是一個login shell。比如對bash而言,啟動參數為"-bash"。當bash以login shell啟動時,它會執行/etc/profile中的命令,然後/etc/profile調用/etc/profile.d目錄下的所有指令碼;然後執行~/.bash_profile,~/.bash_profile調用~/.bashrc,最後~/.bashrc又調用/etc/bashrc。
要識別一個shell是否為login shell,只需在該shell下執行echo $0:
# echo $0
如果輸出為該shell名字,加上一個'-'首碼,則說明該shell為login shell。例如-bash,-su等等。實驗一下,在本人的Ubuntu系統下,開啟Terminal,輸入echo $0,得到的是"bash",說明這不是一個login shell。而由SSH登陸到伺服器上,執行同樣命令,得到了"-bash"的結果,說明由SSH登陸的為login shell。

非login的:不需login而由某些程式啟動的shell。傳遞給shell的參數,是沒有'-'首碼的。還以Bash為例,當以非login方式啟動時,它會調用~/.bashrc,隨後~/.bashrc中調用/etc/bashrc,最後/etc/bashrc調用所有/etc/profile.d目錄下的指令碼。這個有興趣的可以開啟這些檔案看一看。非login的shell主要包括以"#su","#su USERNAME"啟動的shell,和圖形終端(例如Ubuntu的Terminal),執行的指令碼等等。識別非login的shell方法還是執行#echo $0命令,得到的結果如果沒有'-'首碼,即為非login的。

回到我們遇到的問題,在crontab中啟動的指令碼的shell都是非login的。那麼就不會載入/etc/profile中的命令,從而我們在/etc/profile中設定的"ulimit -c unlimited"命令對crontab中啟動的指令碼也是無效的了,因此這些指令碼中啟動的memcached意外掛掉後也不會有core檔案了。

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.