Linux守护进程及作用详解
守护进程是生存期很长的一种进程,它们独立于控制终端,并且周期性地执行某种任务或等待处理某些发生的事件,多数的守护进程都伴随着 Linux 系统启动而启动,关闭而关闭。
Linux 系统中有很多守护进程,大多数服务器也都是用守护进程来实现的。不仅如此,某些守护进程还协助完成了很多系统任务,其中就包括负责计划任务的 atd 和 crond 服务。
Linux 系统中,选择运行哪些守护进程,要根据具体需求来决定,通过以 root 身份执行 ntsysv 命令,可以查看当前系统中拥有哪些守护进程,或者说能够提供哪些服务。有些资料也把守护进程称为“服务”,但严格意义上来说,它们是不同的,服务是静态的概念,而守护进程是动态的概念,服务有守护进程提供。
实际上,按照启动和管理方式的不同,守护进程又可细分为 stand alone 和 xinetd 两类。有关 ntsysv 命令的具体用法,本节不做详细介绍,感兴趣的读者可自行查阅相关资料。
所谓 stand alone,指的是可独立启动的守护进程,这种类型的守护进程以下 2 大特点:
- 可以自动自动运行,而不需要利用系统其它机制来管理;
- 启动之后会一直占用内存和系统资源。
至于 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 只是它的一个符号连接。
直接执行某个 stand alone 守护进程的启动脚本,会显示该启动脚本的用法。以 /etc/init.d/atd 这个脚本来说,执行它会有下面的用法提示:初学者在记忆的时候,需要记住 /etc/init.d 目录即可,至于某些发行版独自安排的目录,可以不用理会。
[root@localhost ~]# /etc/init.d/atd
Usage: /etc/init.d/atd {start|stop|status|restart|condrestart|try-restart|reload|force-reload}
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
}
虽然知道了如何开启一个 xinetd 守护进程,但是当客户请求 rsync 服务的时候,xinetd 怎么就知道启动 /usr/bin/rsync 这个程序呢?答案在 /etc/services 文件中,在此文件中我们可以找到类似下面的内容:
......
rsync 873/tcp # rsync
rsync 873/udp # rsync
......
所有教程
- socket
- Python基础教程
- C#教程
- MySQL函数
- MySQL
- C语言入门
- C语言专题
- C语言编译器
- C语言编程实例
- GCC编译器
- 数据结构
- C语言项目案例
- C++教程
- OpenCV
- Qt教程
- Unity 3D教程
- UE4
- STL
- Redis
- Android教程
- JavaScript
- PHP
- Mybatis
- Spring Cloud
- Maven
- vi命令
- Spring Boot
- Spring MVC
- Hibernate
- Linux
- Linux命令
- Shell脚本
- Java教程
- 设计模式
- Spring
- Servlet
- Struts2
- Java Swing
- JSP教程
- CSS教程
- TensorFlow
- 区块链
- Go语言教程
- Docker
- 编程笔记
- 资源下载
- 关于我们
- 汇编语言
- 大数据
- 云计算
- VIP视频