Linux的終端與進(jìn)程
Linux的普通進(jìn)程(守護(hù)進(jìn)程除外) 是終端的子進(jìn)程,進(jìn)程的存在要依賴終端為其提供空間包括標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)出錯(cuò)。比如,在ssh的客戶端啟動一個(gè)連入linux的終端,運(yùn)行pstree命令,可以看到如下結(jié)果:
可以看到pstree相當(dāng)于當(dāng)前終端啟動的一個(gè)子進(jìn)程。
然后,我們在輸入sleep 2000 &命令,讓終端啟動一個(gè)在后臺運(yùn)行的sleep進(jìn)程,接下來再運(yùn)行pstreee;
可以看到,啟動了一個(gè)pid為1354的進(jìn)程,然后該進(jìn)程的父進(jìn)程為sshd,也就是ssh服務(wù)啟動的終端;
然后,在/proc/1354/fd下,可以看到如下內(nèi)容:
其中的0、1、2分別指標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)出錯(cuò),并且它們都指向了/dev/pts/0;
這里的pts是指:pseudo-terminal slave,是虛擬終端的一種實(shí)現(xiàn)方式,0是虛擬終端的編號??梢暂斎雔l /dev/pts/看一下結(jié)果:
從中可以看出在/dev/pts目錄下,一共有3個(gè)虛擬終端正在運(yùn)行。
現(xiàn)在回到虛擬機(jī)上的終端界面,也就是X系統(tǒng)上的終端,也在后臺運(yùn)行一個(gè)sleep,再進(jìn)到這個(gè)進(jìn)程所對應(yīng)的fd目錄下,可以看到如下結(jié)果:
這里的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)出錯(cuò)指向了/dev/tty1,tty是真正的終端,pts則是對它的虛擬。
在進(jìn)程運(yùn)行過程中(即使是后臺運(yùn)行的進(jìn)程),當(dāng)終端退出時(shí),進(jìn)程將會收到SIGHUP信號,如果程序沒有對這種信號進(jìn)行捕獲處理,進(jìn)程默認(rèn)就會退出。還以剛才那個(gè)在虛擬終端中后臺運(yùn)行的sleep為例:
這是,sleep正在運(yùn)行是的情況,當(dāng)我把它的終端關(guān)閉后,情況為:
bash少了一個(gè),并且sleep沒有了。
因?yàn)殛P(guān)閉了一個(gè)ssh的虛擬終端,自然會少一個(gè)bash,同時(shí)在作為該終端子進(jìn)程的sleep也同時(shí)退出了。
那如何讓一個(gè)程序在終端退出后繼續(xù)工作呢?
首先一個(gè)明確的思路是,可以將要啟動的進(jìn)程的父進(jìn)程設(shè)為init,這樣不過當(dāng)前的終端怎么樣,都不會影響進(jìn)程的運(yùn)行??梢赃@樣:
setuid ping localhost > /dev/null &
或者
( ping localhost > /dev/null &)
可以看出,ping直接成為init的子進(jìn)程了。
另外,也可以用nohup命令來實(shí)現(xiàn)。
【編輯推薦】
- Ubuntu系統(tǒng)下實(shí)現(xiàn)終端嵌入桌面
- Linux進(jìn)程與作業(yè)的區(qū)別及相關(guān)命令
- Linux十大妙用:充當(dāng)Windows修復(fù)工具
- Linux/Unix操作系統(tǒng)處于內(nèi)網(wǎng)的桌面控制
- 紅帽在Linux桌面系統(tǒng)領(lǐng)域的未來——SPICE