複製鏈接
請複製以下鏈接發送給好友

守護進程

鎖定
守護進程(daemon)是一類在後台運行的特殊進程,用於執行特定的系統任務。很多守護進程在系統引導的時候啓動,並且一直運行直到系統關閉。另一些只在需要的時候才啓動,完成任務後就自動結束。 [1] 
中文名
守護進程
外文名
Daemon

守護進程簡介

守護進程是一個在後台運行並且不受任何終端控制的進程。Unix操作系統有很多典型的守護進程(其數目根據需要或20—50不等),它們在後台運行,執行不同的管理任務。
用户使守護進程獨立於所有終端是因為,在守護進程從一個終端啓動的情況下,這同一個終端可能被其他的用户使用。例如,用户從一個終端啓動守護進程後退出,然後另外一個人也登錄到這個終端。用户不希望後者在使用該終端的過程中,接收到守護進程的任何錯誤信息。同樣,由終端鍵入的任何信號(例如中斷信號)也不應該影響先前在該終端啓動的任何守護進程的運行。雖然讓服務器後台運行很容易(只要shell命令行以&結尾即可),但用户還應該做些工作,讓程序本身能夠自動進入後台,且不依賴於任何終端。
守護進程沒有控制終端,因此當某些情況發生時,不管是一般的報告性信息,還是需由管理員處理的緊急信息,都需要以某種方式輸出。Syslog 函數就是輸出這些信息的標準方法,它把信息發送給 syslogd 守護進程。

守護進程創建步驟

(1)創建子進程,終止父進程
由於守護進程是脱離控制終端的,因此首先創建子進程,終止父進程,使得程序在shell終端裏造成一個已經運行完畢的假象。之後所有的工作都在子進程中完成,而用户在shell終端裏則可以執行其他的命令,從而使得程序以孤兒進程形式運行,在形式上做到了與控制終端的脱離。
(2)在子進程中創建新會話
這個步驟是創建守護進程中最重要的一步,在這裏使用的是系統函數setsid。
setsid函數用於創建一個新的會話,並擔任該會話組的組長。調用setsid仃三個作用:讓進程擺脱原會話的控制、讓進程擺脱原進程組的控制和讓進程擺脱原控制終端的控制。
在調用fork函數時,子進程全盤拷貝父進程的會話期(session,是一個或多個進程組的集合)、進程組、控制終端等,雖然父進程退出了,但原先的會話期、進程組、控制終端等並沒有改變,因此,那還不是真正意義上使兩者獨立開來。setsid函數能夠使進程完全獨立出來,從而脱離所有其他進程的控制。
(3)改變工作目錄
使用fork創建的子進程也繼承了父進程的當前工作目錄。由於在進程運行過程中,當前目錄所在的文件系統不能卸載,因此,把當前工作目錄換成其他的路徑,如“/”或“/tmp”等。改變工作目錄的常見函數是chdir。
(4)重設文件創建掩碼
文件創建掩碼是指屏蔽掉文件創建時的對應位。由於使用fork函數新建的子進程繼承了父進程的文件創建掩碼,這就給該子進程使用文件帶來了諸多的麻煩。因此,把文件創建掩碼設置為0,可以大大增強該守護進程的靈活性。設置文件創建掩碼的函數是umask,通常的使用方法為umask(0)。
用fork新建的子進程會從父進程那裏繼承一些已經打開了的文件。這些被打開的文件可能永遠不會被守護進程讀或寫,但它們一樣消耗系統資源,可能導致所在的文件系統無法卸載。 [2] 

守護進程運行方式

①獨立運行的守護進程
獨立運行的守護進程由 init 腳本負責管理,所有獨立運行的守護進程的腳本在/etc/rc.d/init.d/目錄下。系統服務都是獨立運行的守護進程包括 syslogd 和 cron 等。服務器監聽在一個特定的端口上等待客户端的連接。如果客户端產生一個連接請求,守護進程就創建一個子服務器響應這個連接,而主服務器繼續監聽。以保持多個子服務器池等待下一個客户端請求。
②由 xinetd 管理的守護進程
從守護進程的概念可以看出,系統所運行的每一種服務,都必須運行一個監聽某個端口連接所發生的守護進程,這通常意味着資源浪費。為了解決這個問題,Linux引進了“網絡守護進程服務程序”的概念。CentOS 6.4使用的網絡守護進程是xinted(eXtendedInterNET services daemon)。
xinetd能夠同時監聽多個指定的端口,在接受用户請求時,它能夠根據用户請求的端口不同,啓動不同的網絡服務進程來處理這些用户請求。可以把xinetd看作一個管理啓動服務的管理服務器,它決定把一個客户請求交給那個程序處理,然後啓動相應的守護程序。 [3] 

守護進程特點

首先,守護進程最重要的特性是後台運行。其次,守護進程必須與其運行前的環境隔離開來。這些環境包括未關閉的文件描述符、控制終端、會話和進程組、工作目錄以及文件創建掩碼等。這些環境通常是守護進程從執行它的父進程(特別是shell)繼承下來的。最後,守護進程的啓動方式有其特殊之處。它可以在Linux系統啓動時從啓動腳本/etc/rc.d中啓動,也可以由作業控制進程crond啓動,還可以由用户終端(通常是shell)執行。
除了此點以外,守護進程與普通進程基本上沒有什麼區別。因此,編寫守護進程實際上是把一個普通進程按照上述的守護進程的特性改造成為守護進程。 [2] 

守護進程分類

按照服務類型分為如下幾個。
  1. 系統守護進程:syslogd、login、crond、at等。
  2. 網絡守護進程:sendmail、httpd、xinetd、等。
  3. 獨立啓動的守護進程:httpd、named、xinetd等。
  4. 被動守護進程(由xinetd啓動):telnet、finger、ktalk等。 [4] 
參考資料
  • 1.    劉憶智等編著.Linux從入門到精通(第2版):清華大學出版社,2014.02
  • 2.    金國慶,劉加海,季江民,嚴冰編著.LINUX 程序設計(第2版):浙江大學出版社,2015.08
  • 3.    賈如春主編;李利萍副主編.Linux操作系統教程:清華大學出版社,2015.02
  • 4.    王育勤,程海英,彭焱等編著.操作系統原理與應用:清華大學出版社,2013.08