什么是 daemon 与服务 (service)
系统为了某些功能必须要提供一些服务 (不论是系统本身还是网络方面),这个服务就称为 service 。 但是 service 的提供总是需要程序的运行吧!否则如何运行呢?所以达成这个 service 的程序我们就称呼他为 daemon 。
daemon 的主要分类
- 依据 daemon 的启动与管理方式来区分:
- stand_alone:此 daemon 可以自行单独启动服务
- super daemon: 一支特殊的 daemon 来统一管理
Super daemon 的运行示意图:
- 依据 daemon 提供服务的的工作状态来区分:
- signal-control:这种 daemon 是透过讯号来管理的,只要有任何客户端的需求进来,他就会立即启动去处理!例如打印机的服务 (cupsd)。
- interval-control:这种 daemon 则主要是『每隔一段时间就主动的去运行某项工作』
- daemon 的命名守则
这些服务的名称被创建之后,被挂上 Linux 使用时,通常在服务的名称之后会加上一个 d ,例如例行性命令的创建的 at, 与 cron 这两个服务, 他的程序文件名会被取为 atd 与 crond,这个 d 代表的就是 daemon 的意思。
服务与端口的对应: /etc/services
当客户端联机过来我们的主机时, 我们主机是如何分辨不同的服务要求呢?那就是透过埠号 (port number) 啦!埠号简单的想象,他就是你家门牌上面的第几层楼! 这个 IP 与 port 就是因特网联机的最重要机制之一。
port 与 daemon 的对应,客户端连接协议不同,服务导向端口号亦不同:

/etc/services配置可以让服务与埠号对应在一起:
[root@www ~]# cat /etc/services
....(前面省略)....
ftp 21/tcp
ftp 21/udp fsp fspd
ssh 22/tcp # SSH Remote Login Protocol
ssh 22/udp # SSH Remote Login Protocol
....(中间省略)....
http 80/tcp www www-http # WorldWideWeb HTTP
http 80/udp www www-http # HyperText Transfer Protocol
....(底下省略)....
# 这个文件的内容是以底下的方式来编排的:
# <daemon name> <port/封包协议> <该服务的说明>
daemon 的启动脚本与启动方式
daemon 的启动脚本 (shell script) 以及某些重要的配置文件基本上是放在这些地方:
/etc/init.d/* :启动脚本放置处
系统上几乎所有的服务启动脚本都放置在这里!事实上这是公认的目录,我们的 CentOS 实际上放置在 /etc/rc.d/init.d/ 啦! 不过还是有配置连结档到 /etc/init.d/ 的!既然这是公认的目录,因此建议您记忆这个目录即可!
/etc/sysconfig/* :各服务的初始化环境配置文件
几乎所有的服务都会将初始化的一些选项配置写入到这个目录下,举例来说,登录档的 syslog 这支 daemon 的初始化配置就写入在 /etc/sysconfig/syslog 这里呢!而网络的配置则写在 /etc/sysconfig/network 这个文件中。 所以,这个目录内的文件也是挺重要的;
/etc/xinetd.conf, /etc/xinetd.d/* :super daemon 配置文件
super daemon 的主要配置文件 (其实是默认值) 为 /etc/xinetd.conf ,不过我们上面就谈到了, super daemon 只是一个统一管理的机制,他所管理的其他 daemon 的配置则写在 /etc/xinetd.d/* 里头喔!
/etc/* :各服务各自的配置文件
大家的配置文件都是放置在 /etc/ 底下的喔!
/var/lib/* :各服务产生的数据库
一些会产生数据的服务都会将他的数据写入到 /var/lib/ 目录中。举例来说,数据库管理系统 MySQL 的数据库默认就是写入 /var/lib/mysql/ 这个目录下啦!
/var/run/* :各服务的程序之 PID 记录处
Stand alone 的 /etc/init.d/* 启动
[root@www ~]# /etc/init.d/syslog 用法: /etc/init.d/syslog {start|stop|status|restart|condrestart} # 什么参数都不加的时候,系统会告诉你可以用的参数有哪些,如上所示。 范例一:观察 syslog 这个 daemon 目前的状态 [root@www ~]# /etc/init.d/syslog status syslogd (pid 4264) 正在运行... klogd (pid 4267) 正在运行... # 代表 syslog 管理两个 daemon ,这两个 daemon 正在运行中啦! 范例二:重新让 syslog 读取一次配置文件 [root@www ~]# /etc/init.d/syslog restart 正在关闭核心记录器: [ 确定 ] 正在关闭系统记录器: [ 确定 ] 正在启动系统记录器: [ 确定 ] 正在启动核心记录器: [ 确定 ] [root@www ~]# /etc/init.d/syslog status syslogd (pid 4793) 正在运行... klogd (pid 4796) 正在运行... # 因为重新启动过,所以 PID 与第一次观察的值就不一样了!这样了解乎?启动方式以 service 这个程序,或者直接去到 /etc/init.d/ 底下启动,都一样:
[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-all acpid (pid 4536) 正在运行... anacron 已停止 atd (pid 4694) 正在运行... ....(底下省略)....Super daemon 的启动方式
如何得知 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启动如上的 rsync 这个服务,那么你可以这样做:
# 1. 先修改配置文件成为启动的模样: [root@www ~]# vim /etc/xinetd.d/rsync # 请将 disable 那一行改成如下的模样 (原本是 yes 改成 no 就对了) service rsync { disable = no ....(后面省略).... # 2. 重新启动 xinetd 这个服务 [root@www ~]# /etc/init.d/xinetd restart 正在停止 xinetd: [ 确定 ] 正在激活 xinetd: [ 确定 ] # 3. 观察启动的端口 [root@www ~]# grep 'rsync' /etc/services <==先看看端口是哪一号 rsync 873/tcp # rsync rsync 873/udp # rsync [root@www ~]# netstat -tnlp | grep 873 tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 4925/xinetd # 注意看!启动的服务并非 rsync 喔!而是 xinetd ,因为他要控管 rsync 嘛! # 若有疑问,一定要去看看图 1.1.1 才行!