問題:“撫琴煮酒”(餘洪春)在《建構高可用linux伺服器(第二版)》的第119頁中寫到“産生此問題的原因是:雖然shell中提示了nohup成功,但還是需要按鍵盤上的任意鍵退回到shell輸入指令視窗,然後通過在shell中輸入exit來退出終端,而不是每次在nohup執行成功後直接關閉終端。”
解決辦法:使用登入shell防止終端關閉而導緻進行自動退出的情況。我常用的指令行為:su -l -c "nohup /some/command.sh >/dev/null 2>&1 &" 。
ps:red hat/centos啟動時在背景運作使用者指令,可在/etc/rc.local檔案中添加如下行:su -l -c "nohup /some/command.sh >/dev/null 2>&1 &"。
解釋:
(1)su -lc表示以登入shell(-l)執行(-c)指令;
(2)經過腳本測試nohup 後面跟着的>/dev/null 2>&1隻對nohup本身有作用,即很難使用nohup向/some/command.sh 傳遞參數,這一點還沒有找到相關的資料。
什麼是登入shell:(1)使用者登陸時,輸入使用者名和密碼後啟動的shell;(2)通過帶--login參數的指令:bash --login而啟動的shell,對于使用者來說,登陸shell和非登陸shell的主要差別是:啟動shell時所執行的startup檔案不同。非登陸shell執行的startup檔案僅為:~/.bashrc,而登陸shell執行startup檔案為:/etc/profile、~/.bash_profile、~/.bashrc。
什麼是非登入shell:除了以上兩種情況生成的使用者對話,如直接運作bash指令,su某一個使用者等。
什麼是互動shell:一般的使用者與linux系統用指令行進行操作時使用的shell都為互動式shell。
什麼是非互動shell:但執行腳本時,shell就工作在非互動式模式下,因為shell從第一條指令執行到最後一條然後退出,不與使用者進行任何互動。
以上四個定義可以參閱以下連結:
<a href="http://bbs.chinaunix.net/thread-1068678-1-1.html" target="_blank">linux下的bash與sh 詳解以及例子</a>
<a href="http://bbs.chinaunix.net/thread-2018339-1-1.html" target="_blank">登入shell,互動式非登入shell,非互動式shell</a>
<a href="http://kodango.com/what-is-interactive-and-login-shell" target="_blank">什麼是互動式登入 shell</a>
書中原文:
“我的nginx負載均衡器監控nginx程序的腳本nginx_pid需要放入背景不間斷地運作,是以想用指令/bin/sh/data/nginx_pidsh &來達到此目的,在輸入完指令後我就關閉了終端,可再次登入終端時發現此程式并沒有運作。忽然想起可能是因為沒有使用nohup指令,試了試,果然如此,帶上nohup指令後就正常了。
我們的很多程式隻是普通的程式,即使它們使用&結尾,如果終端關閉,那麼程式也會被關閉。為了能夠在背景運作,我們需要使用nohup這個指令,原程式的标準輸出被自動改到目前目錄下的nohupout檔案裡,起到了log的作用。
但是有時候這樣做會有問題:如果把終端關閉,程序也會被自動關閉。檢視nohupout可以看到在關閉終端的瞬間服務自動關閉了。
産生此問題的原因是:雖然shell中提示了nohup成功,但還是需要按鍵盤上的任意鍵退回到shell輸入指令視窗,然後通過在shell中輸入exit來退出終端,而不是每次在nohup執行成功後直接關閉終端。
這個錯誤許多朋友(包括我)容易忽視,希望大家在工作中注意。”
擴充:
在nohup的手冊中有一段話需要認真體會“if standard input is a terminal, redirect it from /dev/null. if standard output is a terminal, append output to ‘nohup.out’ if possible, ‘$home/nohup.out’ otherwise. if standard error is a terminal, redirect it to standard output. to save output to file, use ‘nohup command > file’.”。
什麼是标準輸入?什麼是标準輸出?什麼是标準錯誤輸出?這些問題都比較回答。可以參閱以下連結:
<a href="http://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html" target="_blank">linux shell資料重定向(輸入重定向與輸出重定向)詳細分析</a>
<a href="http://blog.csdn.net/cjfeii/article/details/10084343" target="_blank">linux shell的标準輸入、輸出和錯誤</a>
但“哪些操作或裝置被認為是标準輸入,哪些操作或裝置被認為是标準輸出”這兩個問題不怎麼好回答。從上面那段話可以看出終端既是一種标準輸入裝置又是一種标準輸出裝置(文字中提到的“終端”我認為隻是使用者的字元界面樣式的螢幕而已。)。根據我的了解标準輸入隻能來自使用者的輸入(input)操作,可以認為所有的輸入裝置都是标準的輸入,标準輸出對應所有的輸出裝置如螢幕列印機等,重定向隻是将不同的标準輸入輸出從這些尋常的途徑變為使用者指定了的途徑罷了(改變了标準輸入輸出)。