Systemd 守护进程简介
systemd 守护进程管理 Linux 的启动过程,一般包括服务启动和服务管理。systemd 守护进程可在系统引导时以及运行中的系统上激活系统资源、服务器守护进程和其他进程。
守护进程是在执行各种任务的后台等待或运行的进程。一般情况下,守护进程在系统引导时自动启动并持续运行至关机或您手动将它停止。按照惯例,守护进程名称以 d 结尾。
在 systemd 意义上,服务通常是指一个或多个守护进程。但是,启动或停止服务可能会更改一次系统状态,之后不会留下一个运行中的守护进程(称为 oneshot)。
第一个启动的进程 (PID 1) 是 systemd 守护进程,它提供以下功能:
- 并行化功能(同时启动多个服务),它可提高系统的启动速度。
- 按需启动守护进程,而不需要单独的服务。
- 自动服务依赖关系管理,可以防止长时间超时。例如,只有在网络可用时,依赖网络的服务才会尝试启动。
- 利用 Linux 控制组一起追踪相关进程的方式。
服务单元描述
systemd 单元是一个抽象概念,用于定义系统知道如何管理的对象。
单元通过称为单元文件的配置文件表示,其中封装了关于系统服务、侦听套接字以及与 systemd init 系统相关的其他对象的信息。
单元具有名称和单元类型。名称为单元提供唯一标识。通过单元类型,可以将单元与其他类似的单元类型分组到一起。
systemd 守护进程使用单元来管理不同类型的对象:
-
服务单元具有 .service 扩展名,代表系统服务。您可以使用服务单元来启动经常访问的守护进程,如 web 服务器。
-
套接字单元具有 .socket 扩展名,代表 systemd 应监控的进程间通信 (IPC) 套接字。如果客户端连接到套接字,systemd 管理器将启动一个守护进程并将连接传递给它。您可以使用套接字单元来延迟系统引导时的服务启动,或者按需启动不常使用的服务。
-
路径单元具有 .path 扩展名,用于将服务的激活推迟到特定文件系统更改发生之后。您可以将路径单元用于使用假脱机目录的服务,如打印系统。
要管理单元,可以使用 systemctl 命令。例如,可通过 systemctl -t help 命令来显示可用的单元类型。systemctl 命令接受缩写形式的单元名称、进程树条目和单元描述。
列出服务单元
使用 systemctl 命令来探索系统的当前状态。例如,以下命令会列出并分页显示所有当前加载的服务单元。
[root@host ~]# systemctl list-units –type=service
UNIT LOAD ACTIVE SUB DESCRIPTION
atd.service loaded active running Job spooling tools
auditd.service loaded active running Security Auditing Service
chronyd.service loaded active running NTP client/server
crond.service loaded active running Command Scheduler
dbus.service loaded active running D-Bus System Message Bus
…output omitted…
在本例中,–type=service 选项将 systemd 单元的类型限制为服务单元。输出包含以下几列: UNIT 服务单元名称。
LOAD systemd 守护进程是否正确解析了单元的配置并将该单元加载到内存中。
ACTIVE 单元的高级别激活状态。此信息表明单元是否已成功启动。
SUB 单元的低级别激活状态。此信息指示有关该单元的更多详细信息。信息视单元类型、状态以及单元的执行方式而异。
DESCRIPTION 单元的简短描述。
默认情况下,systemctl list-units –type=service 命令仅列出激活状态为 active 的服务单元。systemctl list-units –all 选项可列出所有服务单元,不论激活状态如何。使用 –state= 选项可按照 LOAD、ACTIVE 或 SUB 字段中的值进行筛选。
[root@host ~]# systemctl list-units –type=service –all
UNIT LOAD ACTIVE SUB DESCRIPTION
atd.service loaded active running Job spooling tools
auditd.service loaded active running Security Auditing …
auth-rpcgss-module.service loaded inactive dead Kernel Module …
chronyd.service loaded active running NTP client/server
cpupower.service loaded inactive dead Configure CPU power …
crond.service loaded active running Command Scheduler
dbus.service loaded active running D-Bus System Message Bus
● display-manager.service not-found inactive dead display-manager.service
…output omitted…
不带任何参数运行 systemctl 命令可列出已加载和活动的单元。
[root@host ~]# systemctl
UNIT LOAD ACTIVE SUB DESCRIPTION
proc-sys-fs-binfmt_misc.automount loaded active waiting Arbitrary…
sys-devices-….device loaded active plugged Virtio network…
sys-subsystem-net-devices-ens3.device loaded active plugged Virtio network…
systemctl 命令 list-units 选项可显示 systemd 服务尝试解析并加载到内存中的单元。此选项不显示已安装但未启用的服务。您可以使用 systemctl 命令 list-unit-files 选项来查看所有已安装的单元文件的状态。
[root@host ~]# systemctl list-unit-files –type=service
UNIT FILE STATE VENDOR PRESET
arp-ethers.service disabled disabled
atd.service enabled enabled
auditd.service enabled enabled
auth-rpcgss-module.service static –
autovt@.service alias –
blk-availability.service disabled disabled
…output omitted…
在 systemctl list-unit-files 命令的输出中,STATE 字段的一些常见条目有 enabled、disabled、static 和 masked。所有 STATE 值都列在 systemctl 命令的 man page 中。
查看服务状态
使用 systemctl status name.type 命令来查看单元的状态。如果省略单元类型,则命令默认匹配具有该名称的服务单元。
[root@host ~]# systemctl status sshd.service
● sshd.service – OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2022-03-14 05:38:12 EDT; 25min ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 1114 (sshd)
Tasks: 1 (limit: 35578)
Memory: 5.2M
CPU: 64ms
CGroup: /system.slice/sshd.service
└─1114 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
Mar 14 05:38:12 workstation systemd[1]: Starting OpenSSH server daemon…
Mar 14 05:38:12 workstation sshd[1114]: Server listening on 0.0.0.0 port 22.
systemctl 命令 status 选项输出中的一些字段:

并非所有这些字段都始终显示在命令输出中。
状态输出中的关键字表示服务的状态
systemctl 输出中的服务状态

验证服务的状态
systemctl 命令可验证服务的具体状态。例如,使用 systemctl 命令 is-active 选项来验证服务单元是否处于活动状态(正在运行):
[root@host ~]# systemctl is-active sshd.service
active
该命令将返回服务单元状态,通常是 active 或 inactive。
运行 systemctl 命令 is-enabled 选项可验证服务单元是否已启用为在系统引导期间自动启动:
[root@host ~]# systemctl is-enabled sshd.service
enabled
该命令将返回服务单元是否已启用为在系统引导期间启动,状态通常是 enabled 或 disabled。
要验证单元是否在启动过程中失败,请运行 systemctl 命令 is-failed 选项:
[root@host ~]# systemctl is-failed sshd.service
active
如果服务运行正常,该命令将返回 active,如果启动过程中发生了错误,则返回 failed。如果单元已被停止,它将返回 unknown 或 inactive。
要列出所有失败的单元,请运行命令:
systemctl –failed –type=service



