认识系统服务 daemons
2024-07-21 02:37:11
供稿:网友
什么是 daemon
假如您经常上网去查看一些资料的话,尤其是关于 Unix-Like 的相关作业系统,如 FreeBSD, Unix, linux 等等,应该会经常听到 daemons 这个字眼,那么 daemon 是什么东西呀!?怎么这么常被见到?呵呵,Daemon 的字面上的意思就是『守护神、恶魔? 』还真是有点希奇呦! ^_^"" 。基本上,我们的 Linux 主机经常会收到一些要求,不论是来自本机系统的要求或者是网路 Client 端的服务要求,反正只要有要求来的时候,通常就是各式各样的 daemons 负责去唤起应该要工作的 Servers 来工作啦!那么 daemons 目前有两种基本的模式,分别是 stand_alone 与 super daemon 两种方式,底下就来说一说这两种 daemon 的工作型态:
· stand_alone : 就字面上的意思来说,stand alone 就是『独立的启动』的意思,也就是说,该 daemon 启动之后,就直接常驻在记忆体当中啰!他虽然会一直的占用系统的资源,但最大的优点就是,他会一直启动的啦!所以当有要求来的时候,他就会很快速的回应啰!经常用在这一种 daemon 的网路服务如常见的 httpd 这一个即是一例!
· super daemon : 相对于 stand alone 的执行方式,这一种服务的启动方式则是藉由统一的一个 daemon 来负责唤起该服务!这一个统一负责的 daemon 就是 inet 这支服务啦!而在 Red Hat 7.x 以后则是使用 xinet 这个设定啰!当有网路的服务要求来的时候,该要求会先送给 inet 这个服务,然后 inet 根据该网路要求送来的资料封包的内容 ( 该内容会记录 ip 与 port ) 来将资料封包送给实际运作的服务!而该服务这个时候才会启动的!最常见到的就是 FTP 这支网路服务啦!这种最大的优点就是当没有资料封包来的时候,该服务不会一直占据系统资源 ( 该服务会在 sleeping 的状态吧! ) ,但是相对的,他的反应时间也会比较慢,因为还要花费一段时间去『唤醒』该服务呀!
那么这两种启动的方式哪一个比较好呢?见仁见智啦!而且还要看该主机的工作负荷与实际的用途说!例如当你的主机是用来作为 WWW 伺服器的,那么 httpd 自然就以 stand alone 的启动方式较佳!事实上,我们经常开玩笑的说明 stand alone 与 super daemon 的情况,以银行的窗口来作为说明的范例!
· stand alone : 在银行里面,假设有一种单一服务的窗口,例如存钱窗口,所以,当你需要存钱的时候,直接前往该窗口,就有『专人』为您服务啦!
· super daemon : 在银行里面假设还有另外一种复合型态的窗口,同时提供转帐、资金调度、提款等等的业务,那当你需要其中一项业务的时候,就需要前往该窗口,但是坐在窗口的这个人,拿到你的需求单之后,往后面一丢『喂!那个转帐的仁兄!该你的工作了』那么那个仁兄就开始工作去!然而里头还有资金调度与提款等负责业务的仁兄呢?他们在干嘛?嘿嘿!看看报、喝喝茶啰!那么这里就会引出另外一个问题啦!假设银行今天的人潮非凡的汹涌,所以这个窗口后面除了你之外还有很多的人!那么想一想,这个窗口是要『一个完成再来下一个』还是『全部都把你们的单据拿来,我全部处理掉』呢?呵呵!是不是不太一样?
o multi-threaded:就是我们提到的,全部的客户之要求都给他拿来,一次给他交办下去,所以一个服务同时会负责好几个程序。
o single-threaded : 这个就是目前我们『人类的银行』最常见的方式啦,不论如何,反正一个一个来,第一个没有处理完之前,后面的请排队!嘿嘿!所以假如 client 的要求忽然大增的话,那么这些晚到的 client 可得等上一等!
另外,需要注重的是,既然银行里头有这两种窗口同时存在,所以啰,在 Linux 系统里面,这两种 daemon 是可以同时存在的啦!也就是说,某些服务可以使用 stand alone 来启动,而有其他的服务则可以使用 inet ( 或者是 xinet ) 大致的情况就是这样啦!了呼!?
OK!这个时候就又发生了另一个问题啰!那么我怎么知道要将我的资料送到那个窗口去!咦!那个窗口不是有写说明说他是干嘛用的吗?!嘿嘿!那个就可以称做是 port 啦!而负责的人员就可以称做 服务 啦!那么在 Linux 系统里面那个档案在说明那个窗口与服务的 ( services and ports ) 对应呢?!呵呵!那就是鼎鼎大名的 /etc/services 这个档案啦!我们取一段经常看到的 port 与相关服务的区段来看一下好了!
[root @test root]# vi /etc/services .... 略 ftp-data 20/tcp ftp-data 20/udp ftp 21/tcp ftp 21/udp ssh 22/tcp # SSH Remote Login PRotocol ssh 22/udp # SSH Remote Login Protocol telnet 23/tcp telnet 23/udp smtp 25/tcp mail smtp 25/udp mail nameserver 42/tcp name # IEN 116 nameserver 42/udp name # IEN 116 domain 53/tcp nameserver # name-domain server domain 53/udp nameserver .... 略 < 该服务的说明 >
像上面说的是,第一栏为 daemon 的名称、第二栏为该 daemon 所使用的 port 号码与其网路资料封包传送时候的类型,主要为较稳定的 tcp 封包与较易破损但较快速之 udp 封包!
举个例子说,那个 e-mail 的发信协定为 smtp 这个服务,而这个服务的使用之 port 即为 25 啦!就这样!
· 请非凡注重!虽然有的时候您可以藉由修改 /etc/services 来更改一个服务的 port 号,不过并不建议如此做,因为很有可能会造成一些协定的错误情况!这里特此说明一番呦!(除非您要架设一个地下网站,否则的话,使用 /etc/services 原先的设定就好啦!)
Daemon 的命名规则:
这个地方也没有什么好说的啦!呵呵!基本上, Linux 系统里面,只要是 daemon 之类的服务项目,他的启动的名称都会多加上一个 d 字样!例如我们之前在 熟悉登录档 里面提到的 syslog 这个登录档服务,他的服务启动名称就是 syslogd 啦!而 例行性命令的建立 当中提到的 at, cron 服务呢?嘿嘿!没错,他们的服务名称就称为 atd, crond 啰!这样了解了吗?!
系统的 Daemons 放在哪里:
好了!那么我们已经知道了 daemon 的作用之后,再来要讨论的是,那么他们启动的 scripts 是放在哪里呀!?呵呵!底下就来说一说啰:
· stand alone : 这个放置在 /etc/rc.d/init.d/ 这个目录里面,几乎所有的 RPM 安装的套件之启动项目都在这里啦!
· super daemon : 这个工作的那一支服务其实就是 xinet 或者是 inet 啦!请注重, xinet 也是一个 daemon 呢!他是 stand alone 启动的,也就是他会一直在监听大家的需求,所以 xinet 的启动 scripts 写在 /etc/rc.d/init.d/xinetd 这个 scripts 里面啰!但是挂在这个 daemon 里头的服务之设定项目呢?嗯!就是写在 /etc/xinetd.conf 与 /etc/xinetd.d/ 这个目录里面的任何档案!
/etc/rc.d/init.d/*
OK!先来了解一下 stand alone 的 daemon 是怎么启动的呢?!很简单,假如我们要启动 syslog 这支记录登录档的服务,那么要启动他的话,就直接下达:
· /etc/rc.d/init.d/syslog start
· service syslog start
亦即是档名之后加上 start 即可,或者是使用 Red Hat 才有的这个 service script 来进行启动的功能!假如你还记得我们前几节提到过的 shell scripts 的话,那么或许还记得 case ..... esac 这个有选择性的项目的语法吧!?没错!这几支服务就是以 bash scripts 里头的 case 语法写成的!因此,只要加上后面的参数,如此一来, scripts 就会自动的去找寻执行档来执行啰!假如有爱好的话,可以在你的系统里面的该目录下开一个档案来观看一下,就知道如何写啰!
/etc/xinetd.conf
这个档案就是设定 xinet 服务的参数档案啦!
/etc/xinetd.d/*
这个目录里面的所有档案就是个别挂上 xinet 的所有服务啦!例如赫赫有名的 wu-ftpd 及 telnet 与 pop3 等等!
了解一下 xinetd.conf
我们先来看一看预设的情况之下, xinet 开启的情况为何?
# # Simple configuration file for xinetd # # Some defaults, and include /etc/xinetd.d/ defaults { instances = 60 log_type = SYSLOG authpriv log_on_sUCcess = HOST PID log_on_failure = HOST cps = 25 30 } includedir /etc/xinetd.d
service { ... ... }
在上面的预设范例当中,说明的是:『假如没有指定的 services ( defaults ) 那么就用 {} 里面的设定来执行之!』正常的情况之下有点像上面例子中的黄色字体所示,那个 <> 里头的资料我们先来说明一下:注:那个 assign_op 主要有三种形式,分别如下:
= : 表示后面的设定参数就是这样啦!
+= : 表示后面的设定为『在原来的设定里头加入新的参数』
-+ : 表示后面的设定为『在原来的参数舍弃这里输入的参数!』
用途不太相同,敬请留意呦!好了!底下再来说一说那些 attribute 与 value !
attribute (功能) assing_op (答应的动作) 说明 (范例)
一般设定项目:
disable yes no 答应该 server 可以执行或者是不能执行! 当设定为 yes 表示该服务不能执行!
socket_type stream dgram raw 当连线为 TCP 封包时,则使用 stream 类型 当连线为 UDP 封包时,则使用 dgram 类型 raw 代表 se