Linux守護行程及作用詳解

2020-07-16 10:05:08
和 Windows 系統一樣,Linux 伺服器在啟動時也需要啟動很多系統服務,它們向本地或網路使用者提供了 Linux 的系統功能介面,直接面向應用程式和使用者,而提供這些服務的程式就是由執行在後台的守護行程來執行的。

守護行程是生存期很長的一種進程,它們獨立於控制終端,並且週期性地執行某種任務或等待處理某些發生的事件,多數的守護行程都伴隨著 Linux 系統啟動而啟動,關閉而關閉。

Linux 系統中有很多守護行程,大多數伺服器也都是用守護行程來實現的。不僅如此,某些守護行程還協助完成了很多系統任務,其中就包括負責計劃任務的 atd 和 crond 服務。

有些資料也把守護行程稱為“服務”,但嚴格意義上來說,它們是不同的,服務是靜態的概念,而守護行程是動態的概念,服務有守護行程提供。

Linux 系統中,選擇執行哪些守護行程,要根據具體需求來決定,通過以 root 身份執行 ntsysv 命令,可以檢視當前系統中擁有哪些守護行程,或者說能夠提供哪些服務。

有關 ntsysv 命令的具體用法,本節不做詳細介紹,感興趣的讀者可自行查閱相關資料。

實際上,按照啟動和管理方式的不同,守護行程又可細分為 stand alone 和 xinetd 兩類。

所謂 stand alone,指的是可獨立啟動的守護行程,這種型別的守護行程以下 2 大特點:
  1. 可以自動自動執行,而不需要利用系統其它機制來管理;
  2. 啟動之後會一直佔用記憶體和系統資源。
基於以上 2 個特點,這種守護行程就擁有一個非常突出的優點,即響應最快。stand alone 守護行程非常多,比如常見的 apache、mysql 等。

至於 xinetd,則是一種比較新型的守護行程,它由一個統一的 stand alone 守護行程來負責喚起,這個特殊的守護行程被稱為 super daemon。

之所以會引入這種機制,是因為 stand alone 會一直佔用記憶體和系統資源,因此有人就提出了按需分配的這種概念。換句話說,當沒有用戶端要求的時候,xinetd 型別的守護行程屬於未啟動狀態,待有用戶端要求服務時,super daemon 才會喚醒指定的 xinetd 守護行程。

很明顯,相比 stand alone 型別,xinetd 型別守護行程的缺點就是不能及時相應,但是優先很明顯,其一,由於 super daemon 負責喚醒各項服務,因此可以賦予 super daemon 安全管控的機制,這就類似網路防火牆的功能了;其二,也是它的設定初衷,即用戶端的聯機結束後就關閉,不會一直佔用系統資源。

大多數 Linux 發行版會將所有 stand alond 守護行程的啟動指令碼都放置在 /etc/init.d/ 目錄下,這是一個公認的目錄,而 CentOS 實際上放在了 /etc/rc.d/init.d/ 目錄,/etc/init.d 只是它的一個符號連線。

初學者在記憶的時候,需要記住 /etc/init.d 目錄即可,至於某些發行版獨自安排的目錄,可以不用理會。

直接執行某個 stand alone 守護行程的啟動指令碼,會顯示該啟動指令碼的用法。以 /etc/init.d/atd 這個指令碼來說,執行它會有下面的用法提示:

[[email protected] ~]# /etc/init.d/atd
Usage: /etc/init.d/atd {start|stop|status|restart|condrestart|try-restart|reload|force-reload}

其中,start、stop 和 restart 這 3 個命令選項是最通用,幾乎被所有 stand alone 守護進行的啟動指令碼支援,分別代表啟動、停止和重新啟動。

xinetd 守護行程的組態檔放置在 /etc/xinetd.d/ 目錄下和 /etc/xinetd.conf 檔案中。其中,xinetd.conf 檔案中的內容一般不用關心,而 /etc/xinetd.d 中的每個檔案代表一個獨立的 xinetd 守護行程。

比如說,rsync 的設定內容如下所示:

[[email protected] ~]# cat /etc/xinetd.d/rsync
# default: off
# description: The rsync server is a good addition to an ftp server, as it
# allows crc checksumming etc.
service rsync
{
    disable = yes
    flags            = IPv6
    socket_type      = stream
    wait             = no
    user             = root
    server           = /usr/bin/rsync
    server_args      = --daemon
    logonfailure     += USERID
}

其中,“disable=yes”代表該守護行程處於關閉狀態,如果想要開啟 rsync 服務,只要將其改為“disable=no”,然後執行 /etc/init.d/xinetd restart 重新啟動 super daemon 即可。這樣,當有用戶端請求 rsync 服務的時候,xinietd 守護行程就會啟動 /usr/bin/rsync 程式來提供服務。

雖然知道了如何開啟一個 xinetd 守護行程,但是當客戶請求 rsync 服務的時候,xinetd 怎麼就知道啟動 /usr/bin/rsync 這個程式呢?答案在 /etc/services 檔案中,在此檔案中我們可以找到類似下面的內容:

......
rsync       873/tcp     # rsync
rsync       873/udp     # rsync
......

因為 rsync 對外提供服務的埠是 873,而 xinetd 也會監聽這個埠,當發現有用戶端連線到這個埠上,根據 /etc/services 檔案就了解到時 rsync 服務,然後根據 /etc/xinetd.d/rsync 檔案中的內容判斷是開啟狀態,於是啟動服務。