Linux Daemon

2024 年 08 月 29 日 | 阅读 9 分钟

什么是守护进程(daemon)?

守护进程是一种在类UNIX操作系统上默默地在后台执行的程序,而不是由用户直接访问。它等待特定条件或事件的出现来触发。

通常,类UNIX系统会运行许多守护进程,主要用于响应网络上其他系统的服务请求、硬件活动以及其他程序的响应。

可以激活守护进程的条件或动作示例包括特定日期或时间、指定时间间隔的过去、从特定通信线路接收到的网络请求或电子邮件,以及文件进入特定目录。

条件或动作的执行者不一定知道守护进程正在监听。

然而,程序通常会执行一个动作,仅仅因为它们知道这会隐式地唤醒一个守护进程。

守护进程也称为后台进程。它是一种在后台执行的UNIX或Linux程序。几乎每个守护进程的名称都以字母“d”结尾。例如,sshd,它管理SSH远程访问连接,或者httpd守护进程,它管理Apache服务器。通常,Linux在启动时就会启动守护进程。

各种shell脚本保存在/etc/init.d目录中。这些脚本用于启动和停止守护进程。

Linux进程

通常,守护进程是作为进程实例化的。这些进程是程序的运行或执行实例。进程由操作系统核心(即内核)处理,内核为所有特殊进程分配标识号。

在Linux中,主要有以下三种常见进程类型:

  • 批次
  • 互动性
  • 守护进程

批处理进程通过进程队列提交,与命令行无关。这些进程非常适合在系统使用率低时执行重复操作。

交互式进程由用户在命令行上交互式执行。

守护进程被系统识别为那些父进程的PID为1的进程。

它总是定义init进程。init进程是Linux系统启动时启动的第一个进程,它会一直存在于系统中,直到系统关闭。

init可以收养任何父进程终止或死亡而未等待子进程状态的进程。

因此,启动守护进程的基本技术是分叉(forking)两次或一次,并让父进程终止,而子进程开始执行其一般功能。

守护进程的历史

一些守护进程由System V的init脚本发布。这些脚本或短程序可以在系统启动时自动执行。它们可能按间隔复制或在会话期间持续存在。

现在,许多守护进程仅在需要时由一个守护进程(xinetd)启动,而不是持续执行。xinetd被称为TCP/IP超级服务器。

它在启动时启动,并监听分配给配置文件(即/etc/xinetd.conf或/etc/inetd.conf)中列出的进程的各种端口。

手动地,一些守护进程也可以在被应用程序和操作系统启动的同时启动。所有守护进程在包括Linux在内的几个类UNIX操作系统中都有一个独立的脚本,可以使用该脚本重新启动和终止它。

这些脚本的管理是根据运行级别(runlevel)来实现的。运行级别可以定义为系统的操作或配置状态,它只允许某些选定的进程可用。启动到不同的运行级别可以帮助解决某些问题,包括纠正系统错误。

守护进程的关键点

下面解释了守护进程的一些重要关键点

  • “daemon”一词源于希腊神话中的“daemon”。这些是介于凡人与神之间的超自然生物,拥有独特的力量或知识。
  • 1963年,在IBM 7094的先锋MAC项目中,"daemon"一词首次应用于系统语境。
  • 它受到麦克斯韦热力学和物理学中“妖精”(daemon)的启发,这是一个抽象的代理,可以帮助对不同速度的分子进行分类,并在后台不知疲倦地工作。
  • 之后,这个词被用来描述不知疲倦地执行系统杂务的后台进程。
  • 第一个计算机守护进程是一个自动创建磁带备份的程序。
  • 这个词被用于计算机用途。它是Disk and Execution MONitor的缩写。
  • 在Microsoft Windows操作系统上,各种称为服务的程序执行守护进程的功能。然而,在这些系统上,有时也使用“daemon”一词。

守护进程的实现

类Unix系统

在类Unix系统中,如果一个进程的父进程死亡,并且该守护进程被指定为init进程(进程号为1的进程)作为父进程,并且严格来说没有控制终端,那么它就是一个守护进程。

然而,守护进程可以是任何后台进程,无论它是否是init进程的子进程。

在类UNIX系统上,一个程序成为守护进程的基本技术,当该程序通过命令行或启动脚本(如System Starter脚本或init脚本)启动时,包括:

  • 可选地从环境中删除不必要的变量。
  • 通过退出和分叉作为后台任务运行。它允许守护进程的父进程(启动或shell进程)接收退出通知并继续正常执行。
  • 通过调用部分分离,通常通过单独的操作setsid()完成。
    • 与控制终端分离。
    • 创建一个新会话并成为该会话的会话领导者。
    • 成为进程组的领导者。
  • 如果守护进程希望确保它不会继承新的控制终端,它可以再次退出并分叉。这意味着它在新会话中不再是会话领导者,并且不能继承任何控制终端。
  • 将当前工作目录设置为根目录,这样进程就不会占用可能位于已挂载文件系统上的任何目录。
  • 将umask修改为0,以允许create()、open()和其他操作系统调用使用其权限掩码,而不依赖于所有调用者的umask。
  • 将文件描述符0、1和2(标准流:stderr、stdout、stdin)重定向到日志文件或/dev/null,并关闭从父进程获取的所有其他文件描述符。

当进程由任何超级服务器守护进程(如systemd、launchd或inetd)启动时,超级服务器将为该进程执行这些功能,除了那些未转换为在systemd下执行并被描述为inetd上的多线程和Type=forking数据报服务器的旧式守护进程。

MS-DOS

在Microsoft DOS平台中,类似守护进程的程序作为终止并驻留(简称TSR)软件执行。

Windows NT

在Microsoft Windows NT系统上,称为Windows服务的程序执行这些守护进程的功能。它们作为进程执行,通常不与鼠标、键盘和显示器交互。它们可以在启动时由操作系统启动。

Windows服务可以通过控制面板(一个专门的配置/控制程序)、PowerShell脚本系统、net stop和net start命令,或服务控制管理器的服务控制器元素进行手动停止、启动和配置。

然而,任何Windows应用程序都可以执行守护进程的职责,而不仅仅是作为服务,一些Windows守护进程可以选择作为普通进程执行。

经典macOS和Mac OS

经典Mac OS中,通过在启动时加载的文件来提供各种可选服务和功能,这些文件重建了操作系统。

这些文件被称为控制面板和系统扩展。标准Mac OS的后期版本通过完全成熟的无界面后台应用程序扩展了这些功能。

这些应用程序是运行在后台的常规应用程序。它们仍然被用户指定为常规系统扩展。

macOS是一个Unix系统,它使用守护进程。macOS使用“服务”一词来指代通过服务菜单选择执行功能的软件,而不是像Windows那样将该术语用于守护进程。

守护进程的典型功能

  • 执行预定操作,如cron。
  • 监控系统,如RAID阵列或硬盘健康状况。
  • 响应网络请求并打开网络端口(如端口80)。

我们如何通过shell提示符启动、重启或停止守护进程?

我们需要使用它们的服务命令,如下所示:

在下面的示例中,启动、重启和停止。

我们如何检查每个正在运行的守护进程列表?

要检查每个已安装守护进程的状态,请键入

规划我们的守护进程

守护进程将做什么?

守护进程必须只做一件事,并且做好。这唯一的事情可能像处理一个或多个域上的大量邮箱一样复杂,或者像调用sendmail向管理员发送邮件并指定报告一样简单。

无论如何,我们都必须对守护进程应该做什么有更好的了解。它将与我们可能指定或不指定的其他守护进程进行交互。这也是需要检查的其他方面。

互动

守护进程绝不能通过终端直接与用户通信。所有通信都通过某种接口(我们可能需要或可能不需要指定),该接口可以像GUI+GTK一样复杂,也可以像单个集合一样简单。

守护进程的基本结构

守护进程启动时,必须进行一些低级别的内务处理,为实际工作做好准备。这包括以下步骤:

  • 分叉一个超级进程(父进程)
  • 修改文件模式掩码(umask)
  • 打开日志以进行写入
  • 创建特殊的会话ID(简称SID)
  • 将当前工作目录修改到安全位置
  • 关闭文件描述符
  • 进入原始守护进程代码

Unix和Linux类系统的守护进程服务列表

  • anacron: 在启动时运行延迟的 cron 操作。
  • amd: 它代表自动挂载守护进程(Auto Mount Daemon)。
  • atd: 它执行使用 at 工具排队的作业。
  • apmd: 它代表高级电源管理守护进程(Advanced Power Management Daemon)。
  • crond: 它是一个任务调度守护进程。
  • autofs: 它协助自动挂载守护进程,允许按需卸载和挂载设备。
  • dhcpd: 它代表动态主机配置协议(Dynamic Host Configuration Protocol)。它也是一个互联网引导协议服务器。
  • cupsd: 它代表CUPS打印机守护进程。
  • ftpd: 它代表FTP服务器守护进程。
  • httpd: 它是一个Web服务器守护进程。
  • gated: 它可以路由替换egpup和routed的守护进程,并管理多个路由协议。
  • lpd: 它代表行式打印机守护进程(Line Printer Daemon)。
  • imapd: 它是imap服务器守护进程。
  • inetd: 它代表互联网超级服务器守护进程(Internet Superserver Daemon)。
  • memcached: 它是一个内存分布式对象缓存守护进程。
  • mysql: 它是一个数据库服务器守护进程。
  • mountd: 它是一个挂载守护进程。
  • nfsd: 它代表网络文件共享守护进程(Network File Sharing Daemon)。
  • named: 它是一个DNS服务器守护进程。
  • nflock: 它用于启动和停止nfs文件锁定服务。
  • ntpd: 它代表网络时间协议服务守护进程(Network Time Protocol service daemon)。
  • nmbd: 它代表网络消息块守护进程(Network Message Block Daemon)。
  • postgresql: 它是一个数据库服务器守护进程。
  • postfix: 它是一个邮件传输代理,用作Sendmail的替代品。
  • rpcbind: 它代表远程过程调用绑定守护进程(Remote Procedure Call Bind Daemon)。
  • routed: 它处理路由表。
  • smbd: 它是一个Samba守护进程。
  • sendmail: 它是一个邮件传输代理守护进程。
  • smtpd: 它代表简单邮件传输协议守护进程(Simple Mail Transfer Protocol Daemon)。
  • squid: 它是一个网页缓存代理服务器守护进程。
  • snmpd: 它代表简单网络管理协议守护进程(Simple Network Management Protocol Daemon)。
  • syncd: 它可以使各种文件系统与系统内存同步。
  • sshd: 它是一个安全Shell服务器守护进程(Secure Shell Server Daemon)。
  • syslogd: 它代表系统日志守护进程。
  • telnetd: 它是一个Telnet服务器守护进程。
  • tcpd: 它有一个服务包装器,可以限制来自hosts.deny和hosts.allow的基于inetd的服务的授权。
  • vsftpd: 它代表非常安全的FTP守护进程(Very Secure FTP Daemon)。
  • webmin: 它是一个基于Web的管理服务器守护进程。
  • xntd: 它是一个网络时间服务器守护进程(Network Time Server Daemon)。
  • xinetd: 它是一个增强的互联网超级服务器守护进程(Enhanced Internet Superserver Daemon)。

下一个主题Linux Zip 命令