本篇將會講解linux的如何後台運行一個程式以及開機啟動機制和如果設定開機啟動,同時會提供一些參考資料。
先說如何後台運行,確切的手勢終端關閉後終端中啟動的進程不被結束。
我們都知道linux的程式是以終端為單位的。如果在終端中啟動了某個程式,當終端關閉後,相應的程式也會終止。
為什麼會這樣呢。因為linux中某個終端啟動的進程都是其子進程,當終端關閉後,linux就會收到hung up (掛電話的意思)的訊號,然後把對應終端的子進程都關閉,然後就沒有然後了。。。
所以要使某個進程不被結束,有兩種辦法:
1.讓linux忽略終端的hung up 訊號,不關閉進程;
2.讓此進程變為終端的非子進程。
第一種的實現方案就是nohup命令。
例如要啟動jboss,可以nohup ./run.sh &。這樣就可以了,結尾的“&”符號表示後台啟動jboss,從而不影響繼續運行其他命令。
但這樣有一個問題,nohup命令雖然可以讓linux“放過”這個進程,但是nohup會同時把進程的控制台輸出重新導向到nohup.txt下(預設是這個檔案),當然可以重新導向為其他的檔案,但是輸出總會有的。
如果jboss運行很長時間,而且如果有很多控制台輸出的話,nohup.txt檔案就會變的很大很大。
通常項目中的日誌都會輸出到特定的記錄檔或者輸出到資料庫中,也就是說控制台的輸出對於程式的意義不大,那麼可不可以拋棄掉這些輸出呢。答案是肯定的。
這裡講解一下linux的重新導向(注意,是linux的重新導向,不是針對nohup)。
0、1和2分別表示標準輸入、標準輸出和標準錯誤資訊輸出,可以用來指定需要重新導向的標準輸入或輸出。
在一般使用時,預設的是標準輸出,既1.當我們需要特殊用途時,可以使用其他標號。例如,將某個程式的錯誤資訊輸出到log檔案中:./program 2>log。這樣標準輸出還是在螢幕上,但是錯誤資訊會輸出到log檔案中。
另外,也可以實現0,1,2之間的重新導向。2>&1:將錯誤資訊重新導向到標準輸出。
Linux下還有一個特殊的檔案/dev/null,它就像一個無底洞,所有重新導向到它的資訊都會消失得無影無蹤。
結合nohup,我們可以這樣nohup ./run.sh >/dev/null &
這是最簡單的一種方式,既保證了程式能夠一直後台執行,又能保證不會產生太大的nohup.txt檔案。
第二種方式就是利用的linux的一個機制,讓程式在subshell中執行,方法很簡單,將命令用括弧() 括起來即可。
ps -ef | grep test
可以看到run.sh的父進程為1,不是當前終端了,這樣就能忽略hung up訊號。
當然linux還可以動態讓程式後台運行或不被hung up 訊號關閉,例如disown命令,setid命令等。
可以參考這篇文章:http://www.cnblogs.com/xianghang123/archive/2011/08/02/2125511.html
下篇文章繼續講解linux的開機啟動機制。