Linux 守護程序

2021-07-03 14:05:34 字數 2952 閱讀 8292

守護程序daemon,是生存期較長的一種程序,名字一般以字母d結尾。它們常常在系統自舉時啟動,僅在系統關閉時才終止。因為它們沒有控制終端,所以說它們是在後台執行的。linux系統有很多守護程序,它們執行日常事務活動。

自舉只有兩個功能:加電自檢和磁碟引導。

加電自檢:當我們按下計算機電源開關時,頭幾秒鐘機器似乎什麼反應也沒有,其實,這時的計算機正在進行加電自檢,以斷定它的所有元件都在正確地工作。如果某個元件有故障,顯示器上就會出現報警提示資訊(如果顯示器也不能正常工作,則以一串嘟嘟聲來報警)。由於大多數計算機工作非常可靠,加電自檢報警非常罕見。

磁碟引導:查詢裝有作業系統的磁碟驅動器。從磁碟載入作業系統的原因有二,一是作業系統公升級簡單容易,二是使使用者擁有選擇作業系統的自由。

當加電自檢和磁碟引導完成時,自舉操作就啟動乙個讀寫操作系統檔案和將它們複製到隨機儲存器中的過程,此時的機器才是真正意義上的計算機。計算機的啟動可以有冷啟動和熱啟動兩種方式 ,它們之間的差別是熱啟動不進行機器的自檢(機器本身配置的檢查與測試),當計算機在使用過程中由於某些原因造成宕機時,可以對計算機進行熱啟動處理。

ps命令可列印系統中各個程序的狀態,該命令有多個選項,有關細節可通過man檢視。下面在ubuntu下執行ps命令:

$ps axj
選項-a顯示由其他使用者所擁有的程序的狀態,-x顯示沒有控制終端的程序狀態,-j顯示與作業有關的資訊。ps的輸出大致是:

ppid   pid  pgid   sid tty      tpgid stat   uid   time command

0 1 1 1 ? -1 ss 0 0:00 /sbin/init

0 2 0 0 ? -1 s 0 0:33[kthreadd]

2 3 0 0 ? -1 s 0 1:28[ksoftirqd/0]

2 5 0 0 ? -1 s< 0 0:00[kworker/0:0h]

2 7 0 0 ? -1 s< 0 0:00[kworker/u:0h]

2 8 0 0 ? -1 s 0 0:01[migration/0]

2 9 0 0 ? -1 s 0 0:00[rcu_bh]

2 10 0 0 ? -1 s 0 7:12[rcu_sched]

按照順序,各列標題的意義是:父程序id、程序id、程序組id、會話id、終端名稱、終端程序組id、程序狀態、使用者id、time以及命令字串。父程序id為0的各程序通常是核心程序,它們作為系統自舉過程的一部分而啟動,init是此種程序的例外,它是系統在自舉時啟動的使用者層命令。核心程序是特殊的,通常存在與系統的整個生命期中,它們以超級使用者特權執行,無控制終端,無命令列。大多數守護程序都以超級使用者特權執行,uid為0,沒有乙個守護程序具有控制終端,其終端名tty設定為問號,終端前台程序組id設定為-1,核心守護程序以無控制終端方式啟動,使用者層守護程序缺少控制終端可能是守護程序呼叫了setsid的結果,所有使用者層守護程序都是程序組的組長程序以及會話的首程序,而且是這些程序組和會話中的唯一程序。

在編寫守護程序程式時,需遵循一些基本規則:

(1)首先要做的是呼叫umask將檔案模式建立遮蔽字設定為0,因為有繼承得來的檔案模式建立遮蔽字可能會拒絕設定某些許可權。

(2)呼叫fork,然後使父程序退出。如果該守護程序由shell命令啟動,父程序退出則認為shell命令執行完畢。子程序繼承了父程序的程序組id,但不是程序組的組長程序。

(3)呼叫setsid以建立乙個新會話,使得呼叫程序成為新會話的首程序,成為新程序組的組長程序,沒有控制終端。

(4)將當前工作目錄更改為根目錄。

(5)關閉不再需要的檔案描述符。

(6)某些守護程序開啟/dev/null使其具有檔案描述符0、1和2,任何乙個試圖讀標準輸入、寫標準輸出或標準出錯的庫例程都不會產生任何效果。因為守護程序並不與終端裝置相關聯,所以不能在終端裝置上顯示輸出,也不能從互動式使用者那裡接收輸入。

與守護程序有關的乙個問題是如何處理出錯訊息,因為它沒有控制終端,所以不能只是簡單地寫到標準出錯上,需要有乙個集中的守護程序出錯記錄設施,如syslogd守護程序,在「/etc/services」檔案中可看到syslog的埠號為514,使用udp傳輸協議。log處理相關函式如下:

#include 

void openlog(const

char *ident, int option, int facility);

void syslog(int priority, const

char *format, ...);

void closelog(void);

void vsyslog(int priority, const

char *format, va_list ap);

為了正常運作,某些守護程序實現為單例項的,也就是在任一時刻只執行該守護程序的乙個副本。檔案鎖和記錄鎖機制是一種方法,該方法用來保證乙個守護程序只有乙個副本在執行。在linux系統中,守護程序遵循下列公共慣例:

(1)若守護程序使用鎖檔案,那麼該檔案通常存放在/var/run目錄中。鎖檔案的名字通常是name.pid,name是該守護程序或服務的名字。

(2)若守護程序支援配置選項,那麼配置檔案通常存放在/etc目錄中。配置檔案的名字通常是name.conf。

(3)守護程序可用命令列啟動,但通常它們是由系統初始化指令碼啟動的,如「/ect/rc*」、「/etc/init.d/*」。

(4)若一守護程序有一配置檔案,那麼當該守護程序啟動時,它讀該檔案,但在此之後一般就不會再檢視它。

Linux守護程序

linux下守護程序一般分為5步,但是實際上只有前兩步是關鍵。第一步 建立子程序,關閉父程序。使用fork 建立,父程序exit 退出。關鍵第二步 建立新的會話id,setsid 作用是使子程序擺脫原有的會話 程序組 終端的控制,其實,linux下每個程序都是由一號程序建立而來的,每個程序都是1號程...

Linux守護程序

程式設計級別 一 守護程序的概念 守護程序是一種生存期比較長的程序,常常在系統自舉時啟動,在系統關閉時退出。因為他們沒有控制終端,因此是在後台執行的。二 守護程序的程式設計規則 1清除檔案模式建立遮蔽字 2成為乙個新的會話首程序 3略hup訊號。然後再次fork 4改變當前工作路徑 5關閉所有的檔案...

Linux 守護程序

概念 無控制終端的會話首程序,或者是孤兒程序組的成員,在後台執行任務。守護程序程式的名稱通常以 d 結尾。程式設計規則 1 呼叫unmask將檔案模式建立遮蔽字設定為乙個已知值 通常是0 因為繼承來的檔案模式建立遮蔽字可能會被設定為拒絕某些許可權。2 呼叫fork,然後父程序exit。作用 1 如果...