首页 > 编程笔记 > Linux笔记 阅读:63

Linux守护进程及作用详解

和 Windows 系统一样,Linux 服务器在启动时也需要启动很多系统服务,它们向本地或网络用户提供了 Linux 的系统功能接口,直接面向应用程序和用户,而提供这些服务的程序就是由运行在后台的守护进程来执行的。

守护进程是生存期很长的一种进程,它们独立于控制终端,并且周期性地执行某种任务或等待处理某些发生的事件,多数的守护进程都伴随着 Linux 系统启动而启动,关闭而关闭。

Linux 系统中有很多守护进程,大多数服务器也都是用守护进程来实现的。不仅如此,某些守护进程还协助完成了很多系统任务,其中就包括负责计划任务的 atd 和 crond 服务。

有些资料也把守护进程称为“服务”,但严格意义上来说,它们是不同的,服务是静态的概念,而守护进程是动态的概念,服务有守护进程提供。

Linux 系统中,选择运行哪些守护进程,要根据具体需求来决定,通过以 root 身份执行 ntsysv 命令,可以查看当前系统中拥有哪些守护进程,或者说能够提供哪些服务。

有关 ntsysv 命令的具体用法,本节不做详细介绍,感兴趣的读者可自行查阅相关资料。

实际上,按照启动和管理方式的不同,守护进程又可细分为 stand alone 和 xinetd 两类。

所谓 stand alone,指的是可独立启动的守护进程,这种类型的守护进程以下 2 大特点:
  1. 可以自动自动运行,而不需要利用系统其它机制来管理;
  2. 启动之后会一直占用内存和系统资源。
基于以上 2 个特点,这种守护进程就拥有一个非常突出的优点,即响应最快。stand alone 守护进程非常多,比如常见的 apache、mysql 等。

至于 xinetd,则是一种比较新型的守护进程,它由一个统一的 stand alone 守护进程来负责唤起,这个特殊的守护进程被称为 super daemon。

之所以会引入这种机制,是因为 stand alone 会一直占用内存和系统资源,因此有人就提出了按需分配的这种概念。换句话说,当没有客户端要求的时候,xinetd 类型的守护进程属于未启动状态,待有客户端要求服务时,super daemon 才会唤醒指定的 xinetd 守护进程。

很明显,相比 stand alone 类型,xinetd 类型守护进程的缺点就是不能及时相应,但是优先很明显,其一,由于 super daemon 负责唤醒各项服务,因此可以赋予 super daemon 安全管控的机制,这就类似网络防火墙的功能了;其二,也是它的设置初衷,即客户端的联机结束后就关闭,不会一直占用系统资源。

大多数 Linux 发行版会将所有 stand alond 守护进程的启动脚本都放置在 /etc/init.d/ 目录下,这是一个公认的目录,而 CentOS 实际上放在了 /etc/rc.d/init.d/ 目录,/etc/init.d 只是它的一个符号连接。

初学者在记忆的时候,需要记住 /etc/init.d 目录即可,至于某些发行版独自安排的目录,可以不用理会。

直接执行某个 stand alone 守护进程的启动脚本,会显示该启动脚本的用法。以 /etc/init.d/atd 这个脚本来说,执行它会有下面的用法提示:

[root@localhost ~]# /etc/init.d/atd
Usage: /etc/init.d/atd {start|stop|status|restart|condrestart|try-restart|reload|force-reload}

其中,start、stop 和 restart 这 3 个命令选项是最通用,几乎被所有 stand alone 守护进行的启动脚本支持,分别代表启动、停止和重启。

xinetd 守护进程的配置文件放置在 /etc/xinetd.d/ 目录下和 /etc/xinetd.conf 文件中。其中,xinetd.conf 文件中的内容一般不用关心,而 /etc/xinetd.d 中的每个文件代表一个独立的 xinetd 守护进程。

比如说,rsync 的配置内容如下所示:

[root@localhost ~]# cat /etc/xinetd.d/rsync
# default: off
# description: The rsync server is a good addition to an ftp server, as it \
# allows crc checksumming etc.
service rsync
{
    disable = yes
    flags            = IPv6
    socket_type      = stream
    wait             = no
    user             = root
    server           = /usr/bin/rsync
    server_args      = --daemon
    logonfailure     += USERID
}

其中,“disable=yes”代表该守护进程处于关闭状态,如果想要开启 rsync 服务,只要将其改为“disable=no”,然后执行 /etc/init.d/xinetd restart 重启 super daemon 即可。这样,当有客户端请求 rsync 服务的时候,xinietd 守护进程就会启动 /usr/bin/rsync 程序来提供服务。

虽然知道了如何开启一个 xinetd 守护进程,但是当客户请求 rsync 服务的时候,xinetd 怎么就知道启动 /usr/bin/rsync 这个程序呢?答案在 /etc/services 文件中,在此文件中我们可以找到类似下面的内容:

......
rsync       873/tcp     # rsync
rsync       873/udp     # rsync
......

因为 rsync 对外提供服务的端口是 873,而 xinetd 也会监听这个端口,当发现有客户端连接到这个端口上,根据 /etc/services 文件就了解到时 rsync 服务,然后根据 /etc/xinetd.d/rsync 文件中的内容判断是开启状态,于是启动服务。