守護(hù)進(jìn)程是一類在后臺(tái)運(yùn)行的特殊進(jìn)程,用于執(zhí)行特定的系統(tǒng)任務(wù)。很多守護(hù)進(jìn)程在系統(tǒng)引導(dǎo)的時(shí)候啟動(dòng),并且一直運(yùn)行直到系統(tǒng)關(guān)閉。另一些只在需要的時(shí)候才啟動(dòng),完成任務(wù)后就自動(dòng)結(jié)束。用戶使守護(hù)進(jìn)程獨(dú)立于所有終端是因?yàn)椋谑刈o(hù)進(jìn)程從一個(gè)終端啟動(dòng)的情況下,這同一個(gè)終端可能被其他的用戶使用。例如,用戶從一個(gè)終端啟動(dòng)守護(hù)進(jìn)程后退出,然后另外一個(gè)人也登錄到這個(gè)終端。用戶不希望后者在使用該終端的過程中,接收到守護(hù)進(jìn)程的任何錯(cuò)誤信息。同樣,由終端鍵入的任何信號(hào)(例如中斷信號(hào))也不應(yīng)該影響先前在該終端啟動(dòng)的任何守護(hù)進(jìn)程的運(yùn)行。雖然讓服務(wù)器后臺(tái)運(yùn)行很容易(只要shell命令行以&結(jié)尾即可),但用戶還應(yīng)該做些工作,讓程序本身能夠自動(dòng)進(jìn)入后臺(tái),且不依賴于任何終端。
守護(hù)進(jìn)程的創(chuàng)建步驟是什么?
(1)創(chuàng)建子進(jìn)程,終止父進(jìn)程:
由于守護(hù)進(jìn)程是脫離控制終端的,因此首先創(chuàng)建子進(jìn)程,終止父進(jìn)程,使得程序在shell終端里造成一個(gè)已經(jīng)運(yùn)行完畢的假象。之后所有的工作都在子進(jìn)程中完成,而用戶在shell終端里則可以執(zhí)行其他的命令,從而使得程序以孤兒進(jìn)程形式運(yùn)行,在形式上做到了與控制終端的脫離。
(2)在子進(jìn)程中創(chuàng)建新會(huì)話:
這個(gè)步驟是創(chuàng)建守護(hù)進(jìn)程中最重要的一步,在這里使用的是系統(tǒng)函數(shù)setsid。setsid函數(shù)用于創(chuàng)建一個(gè)新的會(huì)話,并擔(dān)任該會(huì)話組的組長(zhǎng)。調(diào)用setsid仃三個(gè)作用:讓進(jìn)程擺脫原會(huì)話的控制、讓進(jìn)程擺脫原進(jìn)程組的控制和讓進(jìn)程擺脫原控制終端的控制。在調(diào)用fork函數(shù)時(shí),子進(jìn)程全盤拷貝父進(jìn)程的會(huì)話期(session,是一個(gè)或多個(gè)進(jìn)程組的集合)、進(jìn)程組、控制終端等,雖然父進(jìn)程退出了,但原先的會(huì)話期、進(jìn)程組、控制終端等并沒有改變,因此,那還不是真正意義上使兩者獨(dú)立開來。setsid函數(shù)能夠使進(jìn)程完全獨(dú)立出來,從而脫離所有其他進(jìn)程的控制。
(3)改變工作目錄:
使用fork創(chuàng)建的子進(jìn)程也繼承了父進(jìn)程的當(dāng)前工作目錄。由于在進(jìn)程運(yùn)行過程中,當(dāng)前目錄所在的文件系統(tǒng)不能卸載,因此,把當(dāng)前工作目錄換成其他的路徑,如“/”或“/tmp”等。改變工作目錄的常見函數(shù)是chdir。
(4)重設(shè)文件創(chuàng)建掩碼:
文件創(chuàng)建掩碼是指屏蔽掉文件創(chuàng)建時(shí)的對(duì)應(yīng)位。由于使用fork函數(shù)新建的子進(jìn)程繼承了父進(jìn)程的文件創(chuàng)建掩碼,這就給該子進(jìn)程使用文件帶來了諸多的麻煩。因此,把文件創(chuàng)建掩碼設(shè)置為0,可以大大增強(qiáng)該守護(hù)進(jìn)程的靈活性。設(shè)置文件創(chuàng)建掩碼的函數(shù)是umask,通常的使用方法為umask(0)。
(5)關(guān)閉文件描述符:
用fork新建的子進(jìn)程會(huì)從父進(jìn)程那里繼承一些已經(jīng)打開了的文件。這些被打開的文件可能永遠(yuǎn)不會(huì)被守護(hù)進(jìn)程讀或?qū)懀鼈円粯酉南到y(tǒng)資源,可能導(dǎo)致所在的文件系統(tǒng)無法卸載。
守護(hù)進(jìn)程的運(yùn)行方式是什么?
①獨(dú)立運(yùn)行的守護(hù)進(jìn)程:獨(dú)立運(yùn)行的守護(hù)進(jìn)程由 init 腳本負(fù)責(zé)管理,所有獨(dú)立運(yùn)行的守護(hù)進(jìn)程的腳本在/etc/rc.d/init.d/目錄下。系統(tǒng)服務(wù)都是獨(dú)立運(yùn)行的守護(hù)進(jìn)程包括 syslogd 和 cron 等。服務(wù)器監(jiān)聽在一個(gè)特定的端口上等待客戶端的連接。如果客戶端產(chǎn)生一個(gè)連接請(qǐng)求,守護(hù)進(jìn)程就創(chuàng)建一個(gè)子服務(wù)器響應(yīng)這個(gè)連接,而主服務(wù)器繼續(xù)監(jiān)聽。以保持多個(gè)子服務(wù)器池等待下一個(gè)客戶端請(qǐng)求。
②由 xinetd 管理的守護(hù)進(jìn)程:從守護(hù)進(jìn)程的概念可以看出,系統(tǒng)所運(yùn)行的每一種服務(wù),都必須運(yùn)行一個(gè)監(jiān)聽某個(gè)端口連接所發(fā)生的守護(hù)進(jìn)程,這通常意味著資源浪費(fèi)。為了解決這個(gè)問題,Linux引進(jìn)了“網(wǎng)絡(luò)守護(hù)進(jìn)程服務(wù)程序”的概念。CentOS 6.4使用的網(wǎng)絡(luò)守護(hù)進(jìn)程是xinted。xinetd能夠同時(shí)監(jiān)聽多個(gè)指定的端口,在接受用戶請(qǐng)求時(shí),它能夠根據(jù)用戶請(qǐng)求的端口不同,啟動(dòng)不同的網(wǎng)絡(luò)服務(wù)進(jìn)程來處理這些用戶請(qǐng)求。可以把xinetd看作一個(gè)管理啟動(dòng)服務(wù)的管理服務(wù)器,它決定把一個(gè)客戶請(qǐng)求交給那個(gè)程序處理,然后啟動(dòng)相應(yīng)的守護(hù)程序。
關(guān)鍵詞: 守護(hù)進(jìn)程的創(chuàng)建步驟是什么 守護(hù)進(jìn)程的運(yùn)行方式是什么 為什么要有守護(hù)進(jìn)程 root守護(hù)進(jìn)程怎么啟動(dòng)