Linux的 普通進程(守護進程除外) 是 終端的子進程,進程的存在要依賴終端爲其提供空間包括標準輸入、標準輸出、標準出錯。好比,在ssh的客戶端啓動一個連入linux的終端,運行pstree命令,能夠看到以下結果:linux
能夠看到pstree至關於當前終端啓動的一個子進程。bash
而後,咱們在輸入sleep 2000 &命令,讓終端啓動一個在後臺運行的sleep進程,接下來再運行pstreee:ssh
能夠看到,啓動了一個pid爲1354的進程,而後該進程的父進程爲sshd,也就是ssh服務啓動的終端ui
而後,在/proc/1354/fd下,能夠看到以下內容:spa
其中的0、一、2分別指標準輸入、標準輸出和標準出錯,而且它們都指向了/dev/pts/0.net
這裏的pts是指:pseudo-terminal slave,是虛擬終端的一種實現方式, 0是虛擬終端的編號。能夠輸入ll /dev/pts/看一下結果:orm
從中能夠看出在/dev/pts目錄下,一共有3個虛擬終端正在運行blog
如今回到虛擬機上的終端界面,也就是X系統上的終端,也在後臺運行一個sleep,再進到這個進程所對應的fd目錄下,能夠看到以下結果:進程
這裏的標準輸入、標準輸出和標準出錯指向了/dev/tty1,tty是真正的終端,pts則是對它的虛擬。terminal
在進程運行過程當中(即便是後臺運行的進程),當終端退出時,進程將會收到SIGHUP信號,若是程序沒有對這種信號進行捕獲處理,進程默認就會退出。還以剛纔那個在虛擬終端中後臺運行的sleep爲例:
這是,sleep正在運行是的狀況,當我把它的終端關閉後,狀況爲:
bash少了一個,而且sleep沒有了。
由於關閉了一個ssh的虛擬終端,天然會少一個bash,同時在做爲該終端子進程的sleep也同時退出了。
那如何讓一個程序在終端退出後繼續工做呢?
首先一個明確的思路是,能夠將要啓動的進程的父進程設爲init,這樣不過當前的終端怎麼樣,都不會影響進程的運行。能夠這樣:
setuid ping localhost > /dev/null & 或者
( ping localhost > /dev/null &)
能夠看出,ping直接成爲init的子進程了。
另外,也能夠用nohup命令來實現。
詳細的方法能夠參考: http://blog.csdn.net/AZ9009ZA/archive/2011/01/31/6170730.aspx