什么是 daemon 与服务 (service)

系统为了某些功能必须要提供一些服务 (不论是系统本身还是网络方面),这个服务就称为 service 。 但是 service 的提供总是需要程序的运行吧!否则如何运行呢?所以达成这个 service 的程序我们就称呼他为 daemon 。

daemon 的主要分类

  • 依据 daemon 的启动与管理方式来区分
    • stand_alone:此 daemon 可以自行单独启动服务
    • super daemon: 一支特殊的 daemon 来统一管理
      Super 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 的对应,客户端连接协议不同,服务导向端口号亦不同: 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 才行!