天天看點

Liunx守護程序

1.什麼是守護程序?

        守護程序,也就是通常說的Daemon程序,是Linux中的背景服務程序。它是一個生存期較長的程序,通常獨立于控制終端并且周期性地執行某種任務或等待處理某些發生的事件。守護程序常常在系統引導裝入時啟動,在系統關閉時終止。Linux系統有很多守護程序,大多數服務都是通過守護程序實作的,同時,守護程序還能完成許多系統任務,例如,作業規劃程序crond、列印程序lqd等(這裡的結尾字母d就是Daemon的意思)。

         在Linux中,每一個系統與使用者進行交流的界面稱為終端,每一個從此終端開始運作的程序都會依附于這個終端,這個終端就稱為這些程序的控制終端,當控制終端被關閉時,相應的程序都會自動關閉。但是守護程序卻能夠突破這種限制,它從被執行開始運轉,直到整個系統關閉時才退出。如果想讓某個程序不因為使用者或終端或其他地變化而受到影響,那麼就必須把這個程序變成一個守護程序。

2. Linux守護程序的分類

     根據守護程序的啟動和管理方式,可以分為獨立啟動守護程序和超級守護程序兩類

     獨立啟動(stand_alone):該類程序啟動後就常駐記憶體,是以會一直占用系統資源。其最大的優點就是它會一直啟動,當外界有要求時相應速度較快,像httpd等程序;

     超級守護程序:系統啟動時由一個統一的守護程序xinet來負責管理一些程序,當相應請求到來時需要通過xinet的轉接才可以喚醒被xinet管理的程序。這種程序的優點時最初隻有xinet這一守護程序占有系統資源,其他的内部服務并不一直占有系統資源,隻有資料包到來時才會被xinet管理者來喚醒。并且我們還可以通過xinet來對它所管理的程序設定一些通路權限,相當于多了一層管理機制。

3、 守護程序實作的步驟:

(1)建立子程序,父程序退出(使子程序成為孤兒程序)

        這是編寫守護程序的第一步,由于守護程序是脫離終端的,是以完成第一步後就會在shell終端裡造成一個程式已經運作完畢的假象。之後的所有工作在子程序中完成,而使用者在shell終端裡則可以執行其他指令,進而在形式上做到了與控制終端脫離。實作的語句如下:if(pid=fork()){exit(0);}是父程序就結束,然後子程序繼續執行。

(2)   在子程序中建立新的會話(脫離控制終端)

    這步是建立守護程序中最重要的一步,雖然實作起來很簡單,但是它的意義非常重要,在這裡使用的是系統函數setsid()來建立一個新的會話,并且擔任該會話組的組長。在這裡有兩個概念需要解釋一下,程序組合會話期。

    程序組:是一個或多個程序的集合。程序組有程序組ID來唯一辨別。除了程序号(PID)之外,程序組ID也是一個程序的必備屬性。每個程序組都有一個組長程序,其組長程序的程序号等于程序組ID。且該程序組ID不會因組長程序的退出而受到影響。

    會話周期:會話期是一個或者多個程序的集合。通常一個會話開始于使用者的登入,終止于使用者的退出,在此期間該使用者運作的所有程序都屬于這個會話期。

    Setsid()函數的相關内容:

    (1)  setsid()函數的作用:建立一個新的會話,并且擔任該會話組的組長。具體作用包括:讓一個程序擺脫原會話的控制,讓程序擺脫原程序的控制,讓程序擺脫原控制終端的控制。

    (2)  建立守護程序要調用setsid()函數的原因:由于建立守護程序的第一步是調用fork()函數來建立子程序,再将父程序退出。由于在調用了fork()函數的時候,子程序拷貝了父程序的會話期、程序組、控制終端等資源、雖然父程序退出了,但是會話期、程序組、控制終端等并沒有改變,是以,需要用setsid()韓式來時該子程序完全獨立出來,進而擺脫其他程序的控制。

(3)  改變目前目錄為根目錄

    使用fork()建立的子程序是繼承了父程序的目前工作目錄,由于在程序運作中,目前目錄所在的檔案系統是不能解除安裝的,這對以後使用會造成很多的麻煩。是以通常的做法是讓“/”作為守護程序的目前目錄,當然也可以指定其他的别的目錄來作為守護程序的工作目錄。

(4)  重設檔案權限掩碼

    檔案權限掩碼是屏蔽掉檔案權限中的對應位。由于使用fork()函數新建立的子程序繼承了父程序的檔案權限掩碼,這就給該子程序使用檔案帶了很多的麻煩(比如父程序中的檔案沒有執行檔案的權限,然而在子程序中希望執行相應的檔案這個時候就會出問題)。是以在子程序中要把檔案的權限掩碼設定成為0,即在此時有最大的權限,這樣可以大大增強該守護程序的靈活性。設定的方法是:umask(0)。

(5)  關閉檔案描述符

    同檔案權限碼一樣,用fork()函數建立的子程序會從父程序那裡繼承一些已經打開了的檔案。這些檔案被打開的檔案可能永遠不會被守護程序讀寫,如果不進行關閉的話将會浪費系統的資源,造成程序所在的檔案系統無法卸下以及引起預料的錯誤。按照如下方法關閉它們:

for(i=0;i 關閉打開的檔案描述符close(i);

(6)  守護程序的退出

    上面建立了守護程序,當使用者需要外部停止守護程序運作時,往往需要使用kill指令來停止該守護程序,是以守護程序中需要編碼來實作kill發出的signal信号處理,達到程序的正常退出。實作該過程的函數是signal函數:

signal(SIGTERM, sigterm_handler);

                void sigterm_handler(int arg)

                  {

                      //進行相應處理的函數

                  }。

    功能是:将一個給定的函數和一個特定的信号聯系起來,即在收到特定的信号的時候執行相應的函數。

4.Linux守護程序管理工具

        Linux提供了三種不同的守護程序管理工具:redhat-config-services、ntsysv、chkconfig,可以根據具體需要靈活運用。

# service iptables status    #檢視相應服務的狀态,用service需要服務在/etc/init.d/目錄中存在

# netstat -tulp    #會列出相應的服務及其監聽的端口号等,若加n參數會列出端口号

#chkconfig --list |grep 服務名 #會列出現在目前服務的各種狀态,包括在不同運作級别下的啟情況,分為上線兩部分,上部分是獨立啟動的服務,你會看到xinetd也在,下面部分是有inet管理的超級守護程序,沒有運作級别可分的。 

5Linux守護程序的運作方式

    5.1.獨立運作(stand-alone)的守護程序

    獨立運作的守護程序由init腳本負責管理,所有獨立運作的守護程序的腳本在/etc/rc.d/init.d/目錄下。系統服務都是獨立運作的守護程序,包括syslogd和cron等。獨立運作的守護程序的工作方式稱做stand-alone,它是UNIX傳統的C/S模式的通路模式。stand-alone模式的工作原理如圖4-4所示。

    工作在stand-alone模式下的網絡服務有xinetd、route、gated,另外還有Web伺服器Apache和郵件伺服器Sendmail、域名伺服器Bind。在Linux系統中通過stand-alone模式啟動的服務由/etc/rc.d/下面對應的運作級别當中的符号連結啟動。

Liunx守護程式

    5.2.xinetd模式運作獨立的守護程序

從守護程序的概念可以看出,對于系統所要通過的每一種服務,都必須運作一個監聽某個端口連接配接所發生的守護程序,這通常意味着資源浪費。為了解決這個問題,Linux引進了"網絡守護程序服務程式"的概念。Red Hat Linux 9.0使用的網絡守護程序是xinted(eXtended InterNET daemon)。xinetd能夠同時監聽多個指定的端口,在接受使用者請求時,它能夠根據使用者請求的端口的不同,啟動不同的網絡服務程序來處理這些使用者請求。可以把xinetd看做一個管理啟動服務的管理伺服器,它決定把一個客戶請求交給哪個程式處理,然後啟動相應的守護程序。xinetd無時不在運作并監聽它所管理的所有端口上的服務。當某個要連接配接它管理的某項服務的請求到達時,xinetd就會為該服務啟動合适的伺服器。xinetd模式的工作原理如圖所示。

Liunx守護程式

    5.3xinetd和stand-alone工作模式相比,系統不想要每一個網絡服務程序都監聽其服務端口,運作單個xinetd就可以同時監聽所有服務端口,這樣就降低了系統開銷,保護系統資源。但是對于通路量大、經常出現并發通路的情況,xinetd則要頻繁啟動相應的網絡服務程序,反而會導緻系統性能下降。檢視系統為Linux服務提供哪種工作模式,可以在Linux指令行中使用pstree指令,就能看到兩種不同模式啟動的網絡服務。一般來說系統中一些負載高的服務,Sendmail、Apache服務是單獨啟動的;而其他服務類型都可以使用xinetd超級伺服器管理。

上一篇: 什麼是liunx
下一篇: liunx 配置git

繼續閱讀