守護程序常常在系統引導裝入時啟動,在系統關閉時終止。一般說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建立新會話,成為新會話的首程序,成為新程序組的組長程序,擺脫父程...