守护进程


Linux 服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了 Linux 的系统功能接口,直接面向应用程序和用户。提供这些服务的程序是由运行在后台的守护进程来执行的。守护进程是生存期长的一种进程。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。他们常常在系统引导装入时启动,在系统关闭时终止。linux 系统有很多守护进程,大多数服务器都是用守护进程实现的。同时,守护进程完成许多系统任务,比如,作 业规划进程 crond、打印进程 lqd 等。有些书籍和资料也把守护进程称作:“服务”。

守护进程,也就是指 daemon 和 service。


守护进程的分类

根据守护进程的启动和管理方式,可以分为独立启动守护进程和超级守护进程两类

  • 独立启动(stand_alone): 该类进程启动后就常驻内存,所以会一直占用系统资源。其最大的优点就是它会一直启动,当外界有要求时相应速度较快,像 httpd 等进程;

  • 超级守护进程:系统启动时由一个统一的守护进程 xinet 来负责管理一些进程,当相应请求到来时需要通过 xinet 的转接才可以唤醒被 xinet 管理的进程。这种进程的优点时最初只有 xinet 这一守护进程占有系统资源,其他的内部服务并不一直占有系统资源,只有数据包到来时才会被 xinet 管理员来唤醒。并且我们还可以通过 xinet 来对它所管理的进程设置一些访问权限,相当于多了一层管理机制。

如果用两个比喻来形容两类守护进程的话一般会用银行的业务处理窗口来类比:

  • 独立启动:银行里有一种单服务的窗口,像取钱,存钱等窗口,这些窗口边上始终会坐着一个人,如果有人来取钱或存钱,可以直接到相应的窗口去办理,这个处理单一服务的始终存在的人就是独立启动的守护进程;

  • 超级守护进程:银行里还有一种窗口,提供综合服务,像汇款,转账,提款等业务;这种窗口附近也始终坐着一个人(xinet),她可能不提供具体的服务,提供具体服务的人在里面闲着聊天啊,喝茶啊,但是当有人来汇款时他会大声喊一句,小王,有人汇款啦,然后里面管汇款的小王会立马跑过来帮忙办完汇款业务。其他的人继续聊天,喝茶。这些负责具体业务的人我们就称之为超级守护进程。当然可能汇款人会有一些规则,可能不能往北京汇款,他就会提早告诉 xinet,所以如果有人来汇款想汇往北京的话,管理员就直接告诉他这个我们这里办不到的,于是就根本不会去喊汇款员了,相当于提供了一层管理机制。针对这种窗口还存在多线程和单线程的区别:

    • 多线程:将所有用户的要求都提上来,里面的人都别闲着了,都一起干活吧;

    • 单线程:大家都排好队了,一个一个来,里面的人同一时间只有一个人在工作。

这里需要注意的是超级守护进程的管理员 xinet 也是一个守护进程,只不过它的任务就是传话

当然每个守护进程都会监听一个端口(银行窗口),一些常用守护进程的监听端口是固定的,像 httpd 监听 80 端口, sshd 监听 22 端口等;我们可以将其理解为责任制,时候等待,有求必应。具体的端口信息可以通过 cat /etc/services 来查看。


Service 命令

Linux 的 service 命令就是查看和控制所有的独立启动的守护进程。 这个命令不是在所有的 linux 发行版本中都有。主要是在 redhat 系 linux 中。service 此命令位于 /sbin/service,用 file 命令查看此命令会发现它是一个脚本命令。分析脚本可知此命令的作用是去 /etc/init.d 目录下寻找相应的服务,进行开启和关闭等操作。例如 service mysqld stop 等价于 /etc/init.d/mysqld stop


xinetd 程序

xinetd 即 extended internet daemon,xinetd 是新一代的网络守护进程服务程序,又叫超级 Internet 服务器。经常用来管理多种轻量级 Internet 服务。xinetd 提供类似于 inetd+tcp_wrapper 的功能,但是更加强大和安全。

安装及启停

rpm -ivh xinetd*
yum -y install xinetd
# 启动
service xinetd start

# 停止
service xinetd stop

# 重启
service xinetd restart

配置

xinetd 的配置文件是 /etc/xinetd.conf,但是它只包括几个默认值及 /etc/xinetd.d 目录中的配置文件。

如果要启用或禁用某项 xinetd 服务,编辑位于 /etc/xinetd.d 目录中的配置文件。例如,disable 属性被设为 yes,表示该项服务已禁用;disable 属性被设为 no,表示该项服务已启用。

参数和值之间的操作符可以是 =+=-=。所有属性可以使用 =,其作用是分配一个或多个值。某些属性可以使用 +=-=,其作用分别是将其值增加到某个现存的值表中,或将其值从现存值表中删除。

xinetd.conf 配置参数如下

enabled	          是否启用该服务或服务列表
disabled	        是否停用该服务或服务列表
server	          启动脚本的位置
server_args
socket_type	      服务的数据包类型
log_type	        包括:日志类型、路径、报警最大容量、停止服务的最大容量
log_on_success	  成功后要将哪些值记录到日志中
log_on_failure	  失败后要将哪些值记录到日志中
only_from	        只有指定 IP 可以访问
no_access	        指定 IP 不可以访问
access_times	    允许连接的时间
user	            运行此服务进程的用户
wait	            服务将以多线程的方式运行
max_load	        系统最大负载系数
cps m n	          限制每秒 m 个入站连接,如果超过 m,则等待 n 秒,主要用于对付服务攻击
port	            连接的端口
protocol	        连接使用的协议
instances	        最大连接进程数
per_source	      限制每个主机的最大连接数

instances = 60:              表示最大连接进程数为 60 个。
log_type = SYSLOG authpriv:  表示使用 syslog 进行服务登记。
log_on_success= HOST PID:    表示设置成功后记录客户机的 IP 地址的进程 ID。
log_on_failure = HOST:       表示设置失败后记录客户机的 IP 地址。
cps = 25 30:                 表示每秒 25 个入站连接,如果超过限制,则等待 30 秒。主要用于对付拒绝服务攻击。
includedir /etc/xinetd.d:    表示告诉 xinetd 要包含的文件或目录是 /etc/xinetd.d。

Source & Reference