系統為了某些功能必須要提供一些服務 (不論是系統本身還是網絡方面),這個服務就稱為 service 。 但是 service 的提供總是需要程序的運行吧!否則如何運行呢?所以達成這個 service 的程序我們就稱呼他為 daemon 啰! 舉例來說,達成循環型例行性工作排程服務 (service) 的程序為 crond 這個 daemon 啦!本節節選自 鳥哥的 linux 私房菜 -- 基礎學習篇目錄 第十八章、認識系統服務 (daemons)
daemon 的主要分類如果依據 daemon 的啟動與管理方式來區分,基本上,可以將 daemon 分為可獨立啟動的 stand alone , 與透過一支 super daemon 來統一管理的服務這兩大類,這兩類 daemon 的說明如下:
就字面上的意思來說,stand alone 就是『獨立的啟動』的意思。這種類型的 daemon 可以自行啟動而不必透過其他機制的管理; daemon 啟動并加載到內存后就一直占用內存與系統資源。最大的優點就是:因為是一直存在內存內持續的提供服務, 因此對于發生客戶端的要求時,stand alone 的 daemon 響應速度較快。常見的 stand alone daemon 有 WWW 的 daemon (httpd)、FTP 的 daemon (vsftpd) 等等。
這一種服務的啟動方式則是藉由一個統一的 daemon 來負責喚起服務!這個特殊的 daemon 就被稱為 super daemon 。 早期的 super daemon 是 inetd 這一個,后來則被 xinetd 所取代了。這種機制比較有趣的地方在于, 當沒有客戶端的要求時,各項服務都是未啟動的情況,等到有來自客戶端的要求時, super daemon 才喚醒相對應的服務。當客戶端的要求結束后,被喚醒的這個服務也會關閉并釋放系統資源。
服務與端口的對應這種機制的好處是: (1)由于 super daemon 負責喚醒各項服務,因此 super daemon 可以具有安全控管的機制,就是類似網絡防火墻的功能啦! (2)由于服務在客戶端的聯機結束后就關閉,因此不會一直占用系統資源。但是缺點是什么呢? 因為有客戶端的聯機才會喚醒該服務,而該服務加載到內存的時間需要考慮進去,因此服務的反應時間會比較慢一些啦!
為了統一整個因特網的端口號對應服務的功能,好讓所有的主機都能夠使用相同的機制來提供服務與要求服務, 所以就有了『通訊協議』這玩意兒。也就是說,有些約定俗成的服務都放置在同一個埠號上面啦!舉例來說, 網址列上面的 http 會讓瀏覽器向 WWW 服務器的 80 埠號進行聯機的要求!而 WWW 服務器也會將 httpd 這個軟件激活在 port 80, 這樣兩者才能夠達成聯機的!
daemon 的啟動腳本與啟動方式嗯!那么想一想,系統上面有沒有什么配置可以讓服務與埠號對應在一起呢?那就是 /etc/services 啦!
[root@www ~]# cat /etc/services....(前面省略)....ftp 21/tcpftp 21/udp fsp fspdssh 22/tcp # SSH Remote Login PRotocolssh 22/udp # SSH Remote Login Protocol....(中間省略)....http 80/tcp www www-http # WorldWideWeb HTTPhttp 80/udp www www-http # HyperText Transfer Protocol....(底下省略)....# 這個文件的內容是以底下的方式來編排的:# <daemon name> <port/封包協議> <該服務的說明>
提供某個服務的 daemon 雖然只是一支程序而已,但是這支 daemon 的啟動還是需要運行檔、配置文件、運行環境等等, 舉例來說,你可以查閱一下 httpd 這個程序 (man httpd) ,里面可談到不少的選項與參數呢!此外,為了管理上面的方便, 所以通常 distribution 都會記錄每一支 daemon 啟動后所取得程序的 PID 在 /var/run/ 這個目錄下呢! 還有還有,在啟動這些服務之前,你可能也要自行處理一下 daemon 能夠順利運行的環境是否正確等等。鳥哥這里要講的是, 要啟動一支 daemon 考慮的事情很多,并非單純運行一支程序就夠了。
為了解決上面談到的問題,因此通常 distribution 會給我們一個簡單的 shell script 來進行啟動的功能。 該 script 可以進行環境的偵測、配置文件的分析、PID 文件的放置,以及相關重要交換文件案的鎖住 (lock) 動作, 你只要運行該 script ,上述的動作就一口氣連續的進行,最終就能夠順利且簡單的啟動這個 daemon 啰!
那么這些 daemon 的啟動腳本 (shell script) 放在哪里??? 以及某些重要的配置文件又是放置到哪里?基本上是放在這些地方:
Super daemon 的啟動方式剛剛談到了幾乎系統上面所有服務的啟動腳本都在 /etc/init.d/ 底下,這里面的腳本會去偵測環境、搜尋配置文件、 加載 distribution 提供的函數功能、判斷環境是否可以運行此 daemon 等等,等到一切都偵測完畢且確定可以運行后, 再以 shell script 的 case....esac 語法來啟動、關閉、 觀察此 daemon 喔!我們可以簡單的以 /etc/init.d/syslog 這個登錄檔啟動腳本來進行說明:
[root@www ~]# /etc/init.d/syslog用法: /etc/init.d/syslog {start|stop|status|restart|condrestart}# 什么參數都不加的時候,系統會告訴你可以用的參數有哪些,如上所示。范例一:觀察 syslog 這個 daemon 目前的狀態[root@www ~]# /etc/init.d/syslog statussyslogd (pid 4264) 正在運行...klogd (pid 4267) 正在運行...# 代表 syslog 管理兩個 daemon ,這兩個 daemon 正在運行中啦!范例二:重新讓 syslog 讀取一次配置文件[root@www ~]# /etc/init.d/syslog restart正在關閉核心記錄器: [ 確定 ]正在關閉系統記錄器: [ 確定 ]正在啟動系統記錄器: [ 確定 ]正在啟動核心記錄器: [ 確定 ][root@www ~]# /etc/init.d/syslog statussyslogd (pid 4793) 正在運行...klogd (pid 4796) 正在運行...# 因為重新啟動過,所以 PID 與第一次觀察的值就不一樣了!這樣了解乎?由于系統的環境都已經幫你制作妥當,所以利用 /etc/init.d/* 來啟動、關閉與觀察,就非常的簡單!話雖如此, CentOS 還是有提供另外一支可以啟動 stand alone 服務的腳本喔,那就是 service 這個程序。 其實 service 僅是一支 script 啦,他可以分析你下達的 service 后面的參數,然后根據你的參數再到 /etc/init.d/ 去取得正確的服務來 start 或 stop 哩!他的語法是這樣的啦:[root@www ~]# service [service name] (start|stop|restart|...)[root@www ~]# service --status-all選項與參數:service name:亦即是需要啟動的服務名稱,需與 /etc/init.d/ 對應;start|... :亦即是該服務要進行的工作。--status-all:將系統所有的 stand alone 的服務狀態通通列出來范例三:重新啟動 crond 這支 daemon :[root@www ~]# service crond restart[root@www ~]# /etc/init.d/crond restart# 這兩種方法隨便你用哪一種來處理都可以!不過鳥哥比較喜歡使用 /etc/init.d/*范例四:顯示出目前系統上面所有服務的運行狀態[root@www ~]# service --status-allacpid (pid 4536) 正在運行...anacron 已停止atd (pid 4694) 正在運行.......(底下省略)....
系統開啟的服務其實 Super daemon 本身也是一支 stand alone 的服務,因為 super daemon 要管理后續的其他服務嘛,他當然自己要常駐在內存中啦!所以 Super daemon 自己啟動的方式與 stand alone 是相同的! 但是他所管理的其他 daemon 就不是這樣做啰!必須要在配置文件中配置為啟動該 daemon 才行。配置文件就是 /etc/xinetd.d/* 的所有文件。那如何得知 super daemon 所管理的服務是否有啟動呢?你可以這樣做:
[root@www ~]# grep -i 'disable' /etc/xinetd.d/*....(前面省略)..../etc/xinetd.d/rsync: disable = yes/etc/xinetd.d/tcpmux-server: disable = yes/etc/xinetd.d/time-dgram: disable = yes/etc/xinetd.d/time-stream: disable = yes因為 disable 是『取消』的意思,因此如果『 disable = yes 』則代表取消此項服務的啟動,如果是『 disable = no 』 才是有啟動該服務啦?。∕inimal版本內沒有Super daemon 的軟件,查看時沒有任何東西)關于super daemon 的配置文件請詳見解析 super daemon 的配置文件 。
配置啟動后立即啟動服務的方法使用 netstat 這個網絡狀態觀察命令來檢查我們的 port 呢!甚至他也可以幫我們找到該 port 的程序呢 (PID)!
范例一:找出目前系統開啟的『網絡服務』有哪些?[root@www ~]# netstat -tulpActive Internet connections (only servers)Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program nametcp 0 0 www.vbird.tsai:2208 *:* LISTEN 4575/hpiodtcp 0 0 *:737 *:* LISTEN 4371/rpc.statdtcp 0 0 *:sunrpc *:* LISTEN 4336/portmaptcp 0 0 www.vbird.tsai:ipp *:* LISTEN 4606/cuPSDtcp 0 0 www.vbird.tsai:smtp *:* LISTEN 4638/sendmail: accetcp 0 0 *:ssh *:* LISTEN 4595/sshdudp 0 0 *:filenet-tms *:* 4755/avahi-daemon:....(底下省略)....# 看一下上頭, Local Address 的地方會出現主機名與服務名稱的,要記得的是,# 可以加上 -n 來顯示 port number ,而服務名稱與 port 對應則在 /etc/services范例二:找出所有的有監聽網絡的服務 (包含 socket 狀態):[root@www ~]# netstat -lnpActive Internet connections (only servers)Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program nametcp 0 0 127.0.0.1:2208 0.0.0.0:* LISTEN 4575/hpiod....(中間省略)....Active UNIX domain sockets (only servers)Proto RefCnt Flags Type State I-Node PID/Program name Path....(中間省略)....unix 2 [ ACC ] STREAM LISTENING 10624 4701/xfs /tmp/.font-unix/fs7100unix 2 [ ACC ] STREAM LISTENING 12824 5015/Xorg /tmp/.X11-unix/X0unix 2 [ ACC ] STREAM LISTENING 12770 4932/gdm-binary /tmp/.gdm_socket....(以下省略)....# 仔細的瞧一瞧啊,除了原有的網絡監聽 port 之外,還會有 socket 顯示在上面,# 我們可以清楚的知道有哪些服務被啟動呢!范例三:觀察所有的服務狀態[root@www ~]# service --status-all
我們使用 netstat 僅能觀察到目前已經啟動的 daemon ,使用 service 這個命令或者是『 /etc/init.d/* start 』的方法則僅能在目前的環境下立即啟動某個服務而已。 那么重新啟動后呢?該服務是否還是繼續的自動啟動?這個時候我們就得要了解一下,到底我的 Linux 主機是怎么啟動的呢?
- 打開計算機電源,開始讀取 BIOS 并進行主機的自我測試;
- 透過 BIOS 取得第一個可啟動裝置,讀取主要啟動區 (MBR) 取得啟動管理程序;
- 透過啟動管理程序的配置,取得 kernel 并加載內存且偵測系統硬件;
- 核心主動呼叫 init 程序;
- init 程序開始運行系統初始化 (/etc/rc.d/rc.sysinit)
- 依據 init 的配置進行 daemon start (/etc/rc.d/rc[0-6].d/*)
- 加載本機配置 (/etc/rc.d/rc.local)
由上面的流程你可以看到系統服務在啟動時就可以被啟動的地方是在第六個步驟,而事實上第六個步驟就是以不同的運行等級呼叫不同的服務啦! 那么什么叫做運行等級呢?
我們在啟動 Linux 系統時,可以進入不同的模式喔,這模式我們稱為運行等級 (run level)。不同的運行等級有不同的功能與服務, 目前你先知道正常的運行等級有兩個,一個是具有 X 窗口接口的 run level 5 ,另一個則是純文本界面的 run level 3。
[root@www ~]# chkconfig --list [服務名稱][root@www ~]# chkconfig [--level [0123456]] [服務名稱] [on|off]選項與參數:--list :僅將目前的各項服務狀態欄出來--level:配置某個服務在該 level 下啟動 (on) 或關閉 (off)范例一:列出目前系統上面所有被 chkconfig 管理的服務[root@www ~]# chkconfig --list |moreNetworkManager 0:off 1:off 2:off 3:off 4:off 5:off 6:offacpid 0:off 1:off 2:off 3:on 4:on 5:on 6:off....(中間省略)....yum-updatesd 0:off 1:off 2:on 3:on 4:on 5:on 6:offxinetd based services: <==底下為 super daemon 所管理的服務 chargen-dgram: off chargen-stream: off....(底下省略)....# 你可以發現上面的表格有分為兩個區塊,一個具有 1, 2, 3 等數字,一個則被 xinetd # 管理。沒錯!從這里我們就能夠發現服務有 stand alone 與 super daemon 之分。范例二:顯示出目前在 run level 3 為啟動的服務[root@www ~]# chkconfig --list | grep '3:on'范例三:讓 atd 這個服務在 run level 為 3, 4, 5 時啟動:[root@www ~]# chkconfig --level 345 atd on
chkconfig 是否很容易管理我們所需要的服務呢?真的很方便啦~ 你可以輕松的透過 chkconfig 來管理 super daemon 的服務喔!另外,你得要知道的是, chkconfig 僅是配置啟動時默認會啟動的服務而已, 所以該服務目前的狀態如何是不知道的。我們舉個底下的例子來說明好了:范例四:先觀察 httpd ,再觀察默認有無啟動,之后以 chkconfig 配置為默認啟動[root@www ~]# /etc/init.d/httpd statushttpd 已停止 <==根本就沒有啟動[root@www ~]# chkconfig --list httpdhttpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off# 原因是默認并沒有啟動??![root@www ~]# chkconfig httpd on; chkconfig --list httpdhttpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off# 已經配置為『啟動默認啟動』了,再來觀察看看到底該服務啟動沒?[root@www ~]# /etc/init.d/httpd statushttpd 已停止# 哈!竟然還是沒有啟動喔!怎么會這樣???上面的范例四并沒有啟動 httpd 的原因很簡單,因為我們并沒有使用 /etc/init.d/httpd start 嘛!我們僅是配置啟動時啟動而已??!那我們又沒有重新啟動,所以當然使用 chkconfig 并不會導致該服務立即被啟動!也不會讓該服務立即被關閉,而是只有在啟動時才會被加載或取消加載而已喔。而既然 chkconfig 可以配置啟動是否啟動,那么我們能不能用來管理 super daemon 的啟動與關閉呢?非常好!我們就來試看看底下的案例:范例五:查閱 rsync 是否啟動,若要將其關閉該如何處理?[root@www ~]# /etc/init.d/rsync status-bash: /etc/init.d/rsync: No such file or directory# rsync 是 super daemon 管理的,所以當然不可以使用 stand alone 的啟動方式來觀察[root@www ~]# netstat -tlup | grep rsynctcp 0 0 192.168.201.110:rsync *:* LISTEN 4618/xinetdtcp 0 0 www.vbird.tsai:rsync *:* LISTEN 4618/xinetd[root@www ~]# chkconfig --list rsyncrsync on <==默認啟動呢!將它處理成默認不啟動吧[root@www ~]# chkconfig rsync off; chkconfig --list rsyncrsync off <==看吧!關閉了喔!現在來處理一下 super daemon 的東東![root@www ~]# /etc/init.d/xinetd restart; netstat -tlup | grep rsync最后一個命令你會發現原本 rsync 不見了!這樣是否很輕易的就能夠啟動與關閉你的 super daemon 管理的服務呢!
[root@www ~]# chkconfig [--add|--del] [服務名稱]選項與參數:--add :添加一個服務名稱給 chkconfig 來管理,該服務名稱必須在 /etc/init.d/ 內--del :刪除一個給 chkconfig 管理的服務如果我自己寫了一個程序并且想要讓該程序成為系統服務好讓 chkconfig 來管理時, 可以怎么進行呢?只要將該服務加入 init 可以管理的 script 當中,亦即是 /etc/init.d/ 當中即可。 舉個例子,我們在 /etc/init.d/ 里面創建一個 myvbird 文件,該文件僅是一個簡單的服務范例,基本上,沒有任何用途.... 對于該文件的必須性是這樣的:
- myvbird 將在 run level 3 及 5 啟動;
- myvbird 在 /etc/rc.d/rc[35].d 當中啟動時,以 80 順位啟動,以 70 順位結束。
關于所謂的順位問題,我們會在第二十章介紹,這里你先看看即可。 你該如何進行呢?可以這樣做:
[root@www ~]# vim /etc/init.d/myvbird#!/bin/bash# chkconfig: 35 80 70# description: 沒啥!只是用來作為練習之用的一個范例echo "Nothing"這個文件很好玩喔!你可以參考你自己系統上面的文件;基本上,比較重要的是第二行,他的語法是: 『 chkconfig: [runlevels] [啟動順位] [停止順位] 』其中, runlevels 為不同的 run level 狀態,啟動順位 (start number) 與 結束順位 (stop number) 則是在 /etc/rc.d/rc[35].d 內創建以 S80myvbird 及 K70myvbird 為檔名的配置方式![root@www ~]# chkconfig --list myvbirdservice myvbird supports chkconfig, but is not referenced in any runlevel (run 'chkconfig --add myvbird')# 尚未加入 chkconfig 的管理機制中!所以需要再動點手腳[root@www ~]# chkconfig --add myvbird; chkconfig --list myvbirdmyvbird 0:off 1:off 2:off 3:on 4:off 5:on 6:off# 看吧!加入了 chkconfig 的管理當中了!# 很有趣吧!如果要將這些數據都刪除的話,那么就下達這樣的情況:[root@www ~]# chkconfig --del myvbird[root@www ~]# rm /etc/init.d/myvbird
新聞熱點
疑難解答