守護程序 daemon

2021-06-29 16:29:51 字數 3531 閱讀 1971

守護程序常常在系統引導裝入時啟動,在系統關閉時終止。一般說daemon程式在後台執行,

是因為它沒有控制終端,無法和前台的使用者互動。daemon程式一般都作為服務程式使用,

等待客戶端程式與它通訊。我們也把執行的daemon程式稱作守護程序。

乙個守護程序的父程序是init程序,因為它真正的父程序在fork出子程序後就先於子程序exit退出了,

所以它是乙個由init繼承的孤兒程序。守護程序是非互動式程式,沒有控制終端,所以任何輸出,

無論是向標準輸出裝置stdout還是標準出錯裝置stderr的輸出都需要特殊處理。

一般(1) 在系統啟動的時候由啟動指令碼啟動,這些啟動指令碼通常放在/etc/rc.d目錄下

/etc/init.d/xinetd

xinetd_bin=/usr/sbin/xinetd

case "$1" in

start)

startproc -p $xinetd_pidfile -t 1 $xinetd_bin -pidfile $xinetd_pidfile

(2) 由cron定時啟動

/etc/cron.d/eislogging

4-59/10  * * * * root /var/lib/eisanalytics/cron/lognet.pl

(3) 由nohup命令啟動

nohup命令忽略所有結束通話(sighup)訊號

終端退出會發sighup訊號,可能導致終端上執行程式的異常退出

語法:nohup command [ arg … ] [ & ]

e.g: nohup ***.sh &

情況下守護程序可以通過以下幾種方式產生:

standalone daemon: 可以自行啟動而不必透過其他機制的管理(not depend on another service to be activated); 

standalone daemon 啟動並載入到記憶體後就一直占用記憶體與系統資源。最大的優點就是:響應速度較快。

常見的 standalone daemon 有 www 的 daemon(httpd)

super daemon是xinetd,有一類服務由xinetd來負責喚起。當沒有客戶端的要求時,

各項服務都是未啟動的狀態,等到有來自客戶端的要求時,super daemon才喚醒相對應的服務。

當客戶端的要求結束後,被喚醒的這個服務就會關閉並釋放系統資源。

這種機制的好處:

(1)由於 super daemon 負責喚醒各項服務,因此 super daemon 可以具有安全控管的機制

(2)由於服務在客戶端的聯機結束後就關閉,因此不會一直占用系統資源。

這種機制的缺點:

因為有客戶端的聯機才會喚醒該服務,而該服務載入到記憶體需要一定的時間,因此服務的反應時間會比較慢一些,

常見的super daemon 所管理的服務有tftp

1. change the value of key "disable" to "no"

vi /etc/xinetd.d/tftp

service tftp

2. restart xinetd service

service xinetd restart

編寫daemon的步驟:

(1)蔽一些有關控制終端操作的訊號

為防止在守護程序還沒有執行之前,控制終端收到干擾exit或者掛起

signal(sigttou,sig_ign);

signal(sigttin,sig_ign);

signal(sigtstp,sig_ign);

signal(sighup,sig_ign);

(2)在後台執行。

為避免掛起控制終端而將daemon放入後台執行。方法是在程序中呼叫fork使父程序終止,讓daemon在子程序中後台執行。

if(pid=fork())

exit(0);//是父程序,結束父程序,子程序繼續

(3)脫離控制終端,登入會話和程序組

程序屬於乙個程序組,程序組號(gid)就是程序組長的程序號(pid)。登入會話可以包含多個程序組。

這些程序組共享乙個控制終端。這個控制終端通常是建立程序的登入終端。控制終端,登入會話和程序組通常是從父程序繼承下來的。

我們的目的就是要擺脫它們,使之不受它們的影響。方法是在第1點的基礎上,呼叫setsid()使程序成為會話組長:

setsid()

(4)關閉開啟的檔案描述符

程序從建立它的父程序那裡繼承了開啟的檔案描述符。

如不關閉,將會浪費系統資源,造成程序所在的檔案系統無法卸下以及引起無法預料的錯誤。按如下方法關閉它們:

#define   nofile   256  ;//不同系統中不同數值

for(i=0;iumask計算方法:  777 - 檔案當前許可權

(7)處理sigchld(子程序退出訊號)訊號

處理sigchld訊號並不是必須的。但對於某些程序,特別是伺服器程序往往在請求到來時生成子程序處理請求。

如果父程序不等待子程序結束,子程序 將成為殭屍程序(zombie)從而占用系統資源。

如果父程序等待子程序結束,將增加父程序的負擔,影響伺服器程序的併發效能。在linux下可以簡單地 將sigchld訊號的操作設為sig_ign。

signal(sigchld,sig_ign);

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

void run_daemon(char *idents, int facility)

//3. detach from terminal, session, process group

setsid();

//4. close file descriptor

for (int i = 0; i < nofile; ++i)

close(i);

open("/dev/null", o_rdwr);

//5. change to root dir

chdir("/");

//6. reset file mask

umask(0);

//7. handle sigchld

signal(sigchld, sig_ign);

openlog(idents, log_pid, facility);

}int main(int argc, char *argv)

return 0;

}tail -n 2 /var/log/messages

apr  9 07:31:12 esekilx6451 ./daemontest[19915]: current time: thu apr  9 07:31:12 2015

apr  9 07:31:17 esekilx6451 ./daemontest[19915]: current time: thu apr  9 07:31:17 2015



daemon守護程序

daemon守護程序 守護程序是乙個後台程序,不能夠控制終端,所以任何輸出,無論是向標準出錯裝置stderr還是向標準輸出裝置stdout的輸出都需做特別處理。守護程序一般在系統啟動時啟動,它的父程序是init程序。建立守護程序 1在父程序執行fork然後讓父程序退出。2在子程序中使用setsid呼...

守護程序(Daemon)

守護程序 daemon 一般是為了保護我們的程式 服務的正常執行,當程式被關閉 異常退出等時再次啟動程式 恢復服務。例如 http 服務的守護程序叫 httpd,mysql 服務的守護程序叫 mysqld。或者有時候我們需要讓我們的程式 服務能不中斷地執行,在關閉終端後也能在後台默默執行,除了可以這...

守護程序Daemon

是linux的後台服務程序。它是乙個生存週期較長的程序,沒有控制終端,輸出無處顯示。使用者層守護程序的父程序是init程序。守護程序建立步驟 1 建立子程序,父程序退出,子程序被init自動收養 fork exit 2 呼叫setsid建立新會話,成為新會話的首程序,成為新程序組的組長程序,擺脫父程...