📄 0560daemons.htm
字号:
先来谈一谈 daemon 这个玩意儿是个啥咚咚?还记得我们在 <a href="0440processcontrol.php">程序与资源管理</a>
一文当中提到过程序的概念,程序有的在 bash 当中执行程式而触发的,也有开机的时候,
系统自行触发而在背景当中执行的。当然也有系统管理员在开机完成后,登入系统来触发的等等。
不论怎么说,这个 <span class=text_import2>daemon 其实就是一个『在背景当中执行的程序』啦</span>!
比较特殊的是,所谓的 <span class=text_import2>daemon 通常是负责系统上面的某个服务 (service) </span>,
好让系统可以接受来自使用者或者是网路用户端(client)的要求,而加以工作。<br><br>
那么什么又是服务 (service)?所谓的服务很简单啦,意思是说,主机提供的功能。
这些功能主要分为系统上面的,以及针对网路的服务。针对系统上面的服务,例如我们第四篇提到的 crond
与 atd 等等,他主要负责 Linux 主机上面的工作排程;至于网路服务呢?
包括远端连线 SSH 伺服器,或者是全球资讯网 WWW 伺服器等等,这些让用户端连接上来取得资料的服务,
就是网路服务啦!<br><br>
那您了解了,之所以要有主机伺服器就是希望他可以提供我们一些网路服务,或者是主机端自己的服务,
好让我们使用者或者是一般用户可以工作的更愉快!而主机要提供这些服务,必须要有相对应的 daemon
来进行服务需求的监听,例如要提供工作排程的服务,就得要有 atd 或者是 crond 这两个 daemon 才行;
而 daemon 的启动,其实就是某个程式 (program) 的执行,配合这个程式的设定档,
就能够有效的启动该程式,载入常驻到记忆体当中成为 daemon ,并提供相对的服务棉!<br><br>
一般来说,当我们以 run level 3 或者是 run level 5 完整开机进入 Linux 主机后,
系统已经提供我们很多的服务了!包括列印服务、工作排程服务、邮件管理服务等等;
那么这些服务是如何被启动的?他们的工作型态如何?底下我们就来谈一谈棉!<br>
<div style="padding: 10 0 10 0 ;" align="right"><table width="90%"><tr><td><b>Tips:</b><br /><span style="font-style: italic; color : darkgreen"> 很多时候,我们不会很细的去切分什么是 daemon 而什么是 service,
简单的来说,你可以将 service 与 daemon 视作相同的东西!
反正就是某个在背景当中执行的程式,他可以提供某些功能就是了! ^_^
</span></td><td><img src="../images/vbird_face.gif" /></td></tr></table></div>
<hr><a name="daemon_type"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>daemon 的主要分类</span>
<div class=block2>
如果依据 daemon 的启动与管理方式,基本上,可以将 daemon 分为可独立启动的 stand alone ,
与透过统一安全机制管理的 Super daemon 两大类,这两类 daemon 的说明是这样的∶<br><br>
<li><span class=text_import1>stand_alone∶</span></li>
<div class=block2>
就字面上的意思来说,stand alone 就是『独立的启动』的意思,也就是说,该
daemon 启动之后,就直接常驻在记忆体当中棉!他虽然会一直的占用系统的资源,
但最大的优点就是,他会一直启动的啦!所以当有要求来的时候,他就会很快速的回应棉!常常用在这一种
daemon 的网路服务如常见的全球资讯网 WWW 的 daemon (httpd) 这一个即是一例!
因为他需要比较快的回应速度啊!<br><br>
</div>
<li><span class=text_import1>super daemon∶</span></li>
<div class=block2>
相对于 stand alone 的执行方式,这一种服务的启动方式则是藉由统一的一个 daemon
来负责唤起该服务!这一个统一负责的
daemon 就是 inet 这支服务啦!不过,在后来的 Linux 发展套件中,则是使用
xinet 这个设定棉!我们这里以 FC4 的 xinet 来做说明。当有网路的服务要求来的时候,该要求会先送给
xinet 这个服务,然后 xinet 根据该网路要求送来的资料封包的内容 ( 该内容会记录
IP 与 port ) 来将资料封包送给实际运作的服务!而该服务这个时候才会启动的!最常见到的就是
ftp 这支网路服务啦!<br><br>
这种 daemon 最大的优点就是当没有资料封包来的时候,该服务不会一直占据系统资源
( 该服务会在 sleeping 的状态吧! ) ,但是相对的,他的反应时间也会比较慢,
因为还要花费一段时间去『唤醒』该服务呀!<br><br>
</div>
那么这两种启动的方式哪一个比较好呢?见仁见智啦!而且还要看该主机的工作负荷与实际的用途说!
例如当你的主机是用来作为
WWW 伺服器的,那么 httpd 自然就以 stand alone 的启动方式较佳!事实上,我们常常开玩笑的说明
stand alone 与 super daemon 的情况,可以银行的窗口来作为说明的范例!<br><br>
<li><span class=text_import1>stand alone</span> ∶</li>
<div class=block2>
在银行里面,假设有一种单一服务的窗口,例如存钱窗口,所以,当你需要存钱的时候,
直接前往该窗口,就有『专人』为您服务啦!<br><br>
</div>
<li><span class=text_import1>super daemon</span> ∶</li>
<div class=block2>
在银行里面假设还有另外一种复合型态的窗口,同时提供转帐、资金调度、
提款等等的业务,那当你需要其中一项业务的时候,就需要前往该窗口,
但是坐在窗口的这个营业员,拿到你的需求单之后,往后面一丢『喂!那个转帐的仁兄!该你的工作了』
那么那个仁兄就开始工作去!然而里头还有资金调度与提款等负责业务的仁兄呢?他们在干嘛?
嘿嘿!看看报、喝喝茶棉!<br><br>
那么这里就会引出另外一个问题啦!假设银行今天的人潮特别的汹涌,
所以这个窗口后面除了你之外还有很多的人!那么想一想,这个窗口是要『一个完成再来下一个』
还是『全部都把你们的单据拿来,我全部处理掉』呢?呵呵!是不是不太一样?基本上,
针对这种 super daemon 的处理模式有两种,分别是这样∶
<ul>
<li><span class=text_import2>multi-threaded∶</span><br>
就是我们提到的,全部的客户之要求都给他拿来,一次给他交办下去,所以一个服务同时会负责好几个程序。</li><br>
<li><span class=text_import2>single-threaded</span>∶<br>
这个就是目前我们『人类的银行』最常见的方式啦,不论如何,反正一个一个来,
第一个没有处理完之前,后面的请排队!嘿嘿!所以如果
client 的要求突然大增的话,那么这些晚到的 client 可得等上一等!</li></ul>
</div>
另外,需要注意的是,既然银行里头有这两种窗口同时存在,所以棉,在 Linux
系统里面,这两种 daemon 是可以同时存在的啦!也就是说,某些服务可以使用
stand alone 来启动,而有其他的服务则可以使用 xinet ( 或者是 inet )
大致的情况就是这样啦!了乎!?<br><br>
不过,如果以 daemon 的工作状态来区分,则主要分为两类∶<ul>
<li><span class=text_import2>signal-control</span><br>
这种 daemon 是透过讯号来管理的,只要有任何需求进来,他就会立即启动去处理!
例如印表机的服务 (cupsd)</li><br>
<li><span class=text_import2>interval-control</span><br>
这种 daemon 则主要是『每隔一段时间就主动的去执行某项工作』,
所以,即使你设定好设定档之后,他也不会立刻执行,而是某个时间点才会去工作。举例来说,
atd 与 crond 就是这种 (每分钟执行一次!)</li>
</ul>
另外,如果您对于开发程式很有兴趣的话,那么可以自行查阅一下『 man 3 daemon 』
看看系统对于 daemon 的详细说明吧! ^_^。<br><br>
</div>
<hr><a NAME="services"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>与服务有关的埠口对应资料∶
/etc/services</span>
<div class=block2>
现在我们知道系统所提供的服务是执行某个 program ,由该程式的功能所提供的。
也知道一部主机上面可能会同时拥有多个服务,当然,可能会有多个网路服务同时存在。
此时你会不会觉得很奇怪啊?我一部主机同时开启 WWW 与 FTP 时,
用户端跟我要资料,那么主机会回应什么资料给用户端啊?奇不奇怪呢?<br><br>
其实,就如同上面提到的人类的银行一样,不同的服务有不同的窗口号码,
同样的,在 Linux 系统上面,不同的网路服务,确实有不一样的监听埠口 (listen port)。
我们可以透过指定指向主机的某个埠口 (port) 来连上我们想要的服务呢!
举例来说,我们可以在浏览器上面输入这样的网址∶<ul>
<li><a href="http://ftp.isu.edu.tw" target="_blank">http://ftp.isu.edu.tw/</a>
<li><a href="ftp://ftp.isu.edu.tw/" target="_blank">ftp://ftp.isu.edu.tw/</a></ul>
有没有发现,两个网址都是指向 ftp.isu.edu.tw 这个义守大学的 FTP 网站,
但是浏览器上面显示的结果却是不一样的?是啊!这是因为我们指向不同的服务嘛!
一个是 http 这个 WWW 的服务,一个则是 ftp 这个服务,当然显示的结果就不同了。<br><br>
那我们怎么知道那个 port 是由那个服务所启动的呢?
因为目前已经有很多既定的网路通讯协定,这些通讯协定使用的 port 是固定的,
也是公认的标准的 port number ,我们可以称为 well known 的资讯。
那么我们 Linux 主机有没有相关的资讯呢?当然有啊!那就是
<span class=text_import1>/etc/services</span> 这个档案啊!我们取 FC4 的这个档案一部份来说明∶<br>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>vi /etc/services</span>
<span class=term_say>......省略......</span>
ftp-data 20/tcp
ftp-data 20/udp
ftp 21/tcp
ftp 21/udp fsp fspd
ssh 22/tcp # SSH Remote Login Protocol
ssh 22/udp # SSH Remote Login Protocol
telnet 23/tcp
telnet 23/udp
<span class=term_say>......省略......</span>
http 80/tcp www www-http # WorldWideWeb HTTP
http 80/udp www www-http # HyperT
pop3 110/tcp pop-3 # POP version 3
pop3 110/udp pop-3
sunrpc 111/tcp portmapper # RPC 4.0 portmapper TCP
sunrpc 111/udp portmapper # RPC 4.0 portmapper UDP
netbios-ns 137/tcp # NETBIOS Name Service
netbios-ns 137/udp
netbios-dgm 138/tcp # NETBIOS Datagram Service
netbios-dgm 138/udp
netbios-ssn 139/tcp # NETBIOS session service
netbios-ssn 139/udp
<span class=term_say>......省略......</span>
<span class=term_say># 这个档案的内容是以底下的方式来编排的∶
# <daemon name> <port 与资料型态> <该服务的说明></span>
</pre></td></tr></table>
像上面说的是,第一栏为 daemon 的名称、第二栏为该 daemon 所使用的 port
号码与其网路资料封包传送时候的类型,主要为确定连线后才进行资料传输的可靠的 TCP 封包,
以及较快速但不确定性较高的 UDP 封包等。
举个例子说,那个 e-mail 的发信协定为 smtp 这个服务,而这个服务的使用之
port 即为 25 啦!就这样!<br>
<div style="padding: 10 0 10 0 ;" align="right"><table width="90%"><tr><td><b>Tips:</b><br /><span style="font-style: italic; color : darkgreen"> 请特别注意!虽然有的时候您可以藉由修改 /etc/services 来更改一个服务的 port
号,不过并不建议如此做,因为很有可能会造成一些协定的错误情况!
这里特此说明一番呦!(除非您要架设一个地下网站,否则的话,使用
/etc/services 原先的设定就好啦!)
</span></td><td><img src="../images/vbird_face.gif" /></td></tr></table></div> </div>
<hr><a NAME="name_rule"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>Daemon 的命名规则∶</span>
<div class=block2>
每一个服务的开发者,当初在开发他们的服务时,都有特别的故事啦!
不过,无论如何,这些服务的名称被建立之后,被挂上
Linux 使用时,通常在服务的名称之后会加上一个 d ,例如例行性命令的建立的
at, 与 cron 这两个服务,通常会被称为 atd 与 crond,这个 d 代表的就是 daemon
的意思。所以,在<a href="0440processcontrol.php">资源管理</a>那一章中,我们使用了
ps 与 top 来观察程序时,都会发现到很多的 xxxd 的程序,呵呵!通常那就是一些
daemon 的程序棉!<br><br>
</div>
<hr><a NAME="Whereisdaemon"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>系统的 Daemons 放在哪里∶</span>
<div class=block2>
我们说过, daemon 其实是一支可以在背景执行的程式,这个程式可以负责系统的某个服务。
而既然要负责某个服务,当然棉,就需要有所谓的设定档棉~而为了让使用者可以很轻易的启动该服务,
因此各主要的 Linux distributions 都会替他们的系统进行较有亲和力的启动 daemon 的方式,
那就是利用 shell script 啦!这也是为何我们会在第三篇的时候建议您务必要学习 shell
script 的原因啊!^_^<br><br>
举个例子来说,在 FC4 上面管理系统登录档的服务为 syslogd 这个 daemon,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -