天天看點

Linux守護程序--依然是程序

在linux中,服務是一種特殊的程序,可以說它和使用者無關,它的作用不是完成使用者任務,而是進行一些管理類的操作或者通用的服務類操作,實際上linux的服務就是一個程序,也僅僅是一個程序。

在linux中,服務叫做守護程序,和windows一樣,它也執行和具體使用者任務無關的支撐性質的任務,可是不同于windows服務複雜的架構,linux守護程序卻是一個普通的程序,除此之外它的巧妙在于它是如何成為服務的。在linux中,運作着很多的伺服器程式,實際上linux很大意義上就是伺服器作業系統。在linux中,終端的意義更大一些,它可以等同于一個shell,負責着一個會話,linux的程序體系架構之一fork/exec機制可以導出shell的重要性,shell就好像一個原點,任何迷路的羔羊都不會走得太遠。終端是使用者來登入的,它控制着該使用者的行為,實際上它可以被看作是該使用者的代理。在linux中,和使用者終端沒有關系的支撐類程序就是守護程序,于是守護程序成了一類相對特殊的程序,隻是相對特殊,在業務意義上的特殊,就程序本身而言,它沒有什麼特殊的。linux的程序體系架構之二程序組/會話期使得守護程序得以如此簡單的實作,守護程序無終端,因為它不屬于任何具體使用者(也可以屬于),無須與使用者互動(這點很重要),守護程序不能依賴任何使用者程序...具體守護程序的定義,google吧。同樣通過一個例子來了解枝枝蔓蔓:

#include.h>

#include

int main()

{

int i,fd,len;

len = strlen(buf);

if(fork()!=0)

exit(0);

setsid(); //脫離終端

chdir("/"); //更改根目錄

umask(0); //清除掩碼

for(i=0;i<3;i++)

close(i);

//為了防止此守護程序重新開啟一個終端,可以再fork一次然後退出父程序,這樣可以放棄會話組長的身份,因為setsid的調用者将成為會話組長,隻有會話組長可以開啟終端。

//以下可以開始真正的服務過程

}//編譯為ServiceDemo

這就是一個簡單的守護程序,但是怎麼啟動呢?直接運作當然可以,前面說過守護程序是無使用者關聯的,也就是可以開機自動啟動的,那麼誰來啟動呢?有沒有像windows那麼酷的啟動方式呢?當然有,linux無所不能的,以紅帽子為例,其service腳本可以啟動/etc/init.d/下面的服務,比如要啟動vsftpd,那麼就service vsftpd start就搞定了,這樣的話,就要寫一個腳本,内有start,stop等例程:

#!/bin/bash

. /etc/rc.d/init.d/functions

RETVAL=0

prog="ServiceDemo"

start(){

echo -n $"starting up $prog: "

daemon $prog

echo

return $RETVAL

}

stop(){

echo -n $"Shutting down $prog: "

killproc $prog

case "$1" in

start)

start

;;

stop)

stop

restart)

RETVAL=$?

esac

exit $RETVAL

這個腳本檔案命名為demo并且放到/etc/init.d/目錄下,那麼如果要啟動,隻需要service demo start就可以了,比windows的右鍵啟動酷吧,linux的核心或者ServiceDemo守護程序本身根本不知道是怎麼啟動的也沒有必要知道,啟動政策完全可以自定義實作,最起碼根據SystemV和BSD兩種啟動方式的不同就有兩種啟動政策,隻要合理的進行思考,肯定還有更酷的辦法。

linux根本沒有用到什麼SCM/SCP,RPC機制,僅僅用其強大的程序架構就輕松實作了伺服器程序并且沒有引入額外的複雜,總結起來linux(當然繼承于Unix老大)的程序架構精妙之處有二,前面說過第一是程序的組織,fork/exec機制保證所有程序以init為根組成一個樹結構,沒有環,很容易管理,周遊也比較友善;第二就是用到了程序組/會話期的概念,在看似統一的程序樹上割裂成局部,使得程序樹扁平化,這樣的話整體上樹結構好管理,局部上又是一個個小的整體,就好像分形結構一樣。以此為依托,守護程序就是直接挂在init下面的程序了,當然會話期和程序組等概念的互相作用可能不會這麼簡單,但是大體就是這個樣子。在linux中,一切盡量向程序的概念靠攏,在核心中也盡量給執行緒以程序上下文,這樣就可以将一切推向美妙的程序架構,如此,根據一個美妙的機制輕而易舉的實作了一個政策,這是個自下而上設計勝利的例子,像windows那種以使用者為中心的系統是自上而下的設計,它首先考慮的是使用者需求。

最後要說的就是在windows中用rpc進行服務控制,而在linux,強大的信号機制使服務控制變得更加直接并且更加簡單明了。

//

回複:Linux守護程序--依然是程序 guosha

守護程序就是隻要OS啟動了,它就可以存在,不依附于任何其字的程序及裝置,隻依附于OS。是以當在終端啟動程式時,最保險的做法需要加上你文中的那個殼就可以了。原因是終端斷開時會給所有屬于這個會話期的程序發送SIGHUP信号,導緻所有跟這個終端關聯的程序退出,這裡你有三個方法來避免,一是你文中的脫離終端; 二是改變shell的行為,退出時不發送SIGHUP信号給該會話期的其它程序;三是你的程式裡修改SIGHUP信号的處理為不退出。因為程式運作外界環境差異性,最好的方法當然是第一種。但後面兩種某些情況下也不失為一種選擇.

至于service的啟動方式,daemon完成的應該也就是提供類似的功能,用daemon去啟動的程式應該不一定是要已經做成守護程序了的。

 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1273462

繼續閱讀