参考:《鸟哥的Linux私房菜》
一、什么是 daemon 与服务(service)
在英语中的daemon就有守护进程,后台程序的意思。简单来说就是一直在后台运行的进程,我们就称之为服务(service),或者是守护进程(daemon)。这些进程常驻在内存当中,通常都是负责一些系统所提供的功能以服务用户的各项任务,故而需要在后台持续的运行。守护进程独立于控制终端运行,这意味着它们不需要用户的直接交互就可以执行其任务。
那什么是后台,什么是前台呢?在任务管理(job control)中,可以出现提示字符并让你操作的环境就称为前台(foreground),至于其他任务就可以让你放入后台(background)去暂停或运行。
系统为了某些功能必须要提供一些服务(不论是系统本身还是网络方面),这个服务就称为service。
一般来说,daemon和service是一样的东西,我们不需要做区分。因为完成某个服务需要一个daemon在后台中运行,没有这个daemon就不会有service。
守护进程通常在系统启动时由初始化系统启动,或者通过手工方式启动,并且它们会在整个操作系统运行期间持续运行,除非被显式停止。守护进程的主要目的是执行长期运行的任务,例如系统日志记录、打印队列管理、文件备份等。为了确保守护进程不会干扰用户的正常操作,它们会脱离终端和控制台,这意味着即使用户注销或关闭登录会话,守护进程也会继续运行。
守护进程的设计遵循一些特定的原则来确保它们能够有效地独立运行。首先,一个典型的守护进程会在启动后成为其自己的会话领导者,并成为一个新的进程组的组长。这样做是为了避免进程被其父进程的挂起信号所影响。此外,守护进程通常会将其当前工作目录设置为根目录(/),以防止因为文件系统卸载而导致的问题。它们还会关闭所有不需要的文件描述符,包括标准输入、标准输出和标准错误,以减少资源占用并避免潜在的数据丢失。守护进程还会重定向这些文件描述符到/dev/null或适当的日志文件,以便可以记录输出信息而不干扰其他进程或用户。
守护进程在Linux系统中的管理和监控通常是通过各种工具和技术实现的。例如,使用systemd或SysV init脚本来控制守护进程的启动、停止和重启。这些工具允许系统管理员通过命令行或配置文件来管理守护进程。此外,许多守护进程都会实现自我监控机制,当出现故障时能够自动重启,从而提高系统的可靠性和稳定性。
daemon既然是一个程序执行后的进程,那么daemon所处的那个原本的程序通常是如何命名的呢?(daemon程序的命名方式)。每个服务的开发者,在开发他们的服务时,都有特别的故事。不过,无论如何,这些服务的名称被建立之后,在Linux中使用时,通常在服务的名称之后会加上一个d,例如计划任务命令建立的 at 与 cron 这两个服务,它的程序会被取为 atd 与 crond ,这个 d 代表的就是daemon的意思。所以当我们使用 ps 或 top 查看进程时,都会发现很多的 {xxx}d 的进程,通常那就是一些daemon的进程。
守护进程的特点:
- 后台运行:守护进程在后台运行,不与任何终端或控制台直接关联。
- 长期存活:守护进程的生命周期通常很长,通常在系统启动时开始运行,并一直运行到系统关闭或被显式停止。
- 资源管理:为了确保系统的稳定性和性能,守护进程通常会释放不需要的资源,比如关闭标准输入、输出和错误流,并将当前工作目录设置为根目录
/
。 - 权限管理:守护进程可能需要以root权限运行,以便能够使用特殊端口(通常是1-1024之间的端口)或访问某些特殊的系统资源。
- 服务提供:守护进程通常为用户提供某种服务,比如网络服务、打印服务、系统日志服务等。
1.1 init 与 systemd
在早期的Linux系统中,初始化进程(init)是系统启动后第一个运行的进程,它的PID(进程标识号)总是1。init负责读取 /etc/inittab
文件中的配置信息,根据这个配置文件来启动不同的服务和进程。这个初始化进程及其配置文件定义了系统的运行级别、服务的启动顺序以及其他启动时的任务。
随着时间的发展,随着计算机硬件和操作系统的复杂性增加,传统的init系统逐渐暴露出一些不足之处,例如启动速度较慢、依赖关系处理不够灵活等问题。因此,为了提高系统的启动速度和效率,以及更好地支持复杂的依赖关系,systemd
应运而生。
systemd
是一种现代的初始化系统,它提供了一种更为高效的方式来管理服务和进程。相比于传统的init,systemd
提供了以下优点:
- 并行启动:
systemd
可以并行启动多个服务,而不是按照严格的顺序逐个启动。 - 依赖关系管理:
systemd
支持更复杂的依赖关系,可以根据服务之间的依赖关系动态地调整启动顺序。 - 统一的接口:
systemd
提供了一套统一的命令和接口来管理服务,如systemctl
命令。 - 内存管理:
systemd
更好地管理内存资源,例如在需要时加载服务,减少不必要的内存占用。 - 高级特性:
systemd
还支持诸如单元文件(unit files)管理、服务重启策略、日志记录等功能。
由于 systemd
提供了更多的功能和更好的性能,大多数现代Linux发行版已经默认采用了 systemd
作为初始化系统。这意味着在这些系统中,传统的init系统已经被完全替代,用户和管理员现在使用 systemctl
和相关的 systemd
工具来管理服务和进程。
从命名方式可以看出 systemd = system + d 组成,这个 d 代表的就是daemon的意思。
1.2 早期 System V 的 init 管理操作中 daemon 的主要分类(Optional)