1.什么是Linux中的systemd服务
在 Linux 系统中,systemd 是一种系统和服务管理器(System and Service Manager),它是现代大多数 Linux 发行版(如 Fedora、Ubuntu、CentOS 等)默认使用的初始化系统(init system)。它取代了传统的 SysV init
和 Upstart,旨在提高系统启动速度、管理服务的依赖关系,并提供更强大的功能。
1.1 systemd 的核心功能
1)初始化系统
-
负责系统启动流程,并行启动服务以加快开机速度。
-
通过 单元文件(Unit Files) 定义服务、挂载点、定时任务等。
2)服务管理
-
控制服务的启动、停止、重启、状态查看等(通过
systemctl
命令)。 -
支持服务依赖管理(例如:数据库服务需在 Web 服务前启动)。
3)进程监控
- 自动重启崩溃的服务,确保系统稳定性。
4)日志管理
- 集成
journalctl
工具,统一收集系统和服务日志。
5)资源控制
- 限制服务的 CPU、内存等资源使用(通过
cgroups
)。
6)定时任务
- 替代传统的
cron
,通过.timer
单元文件管理定时任务。
1.2单元文件(Unit Files)
每个 systemd 服务对应一个 .unit
配置文件,通常位于以下目录:
-
/etc/systemd/system/
(用户自定义或覆盖配置) -
/lib/systemd/system/
(系统默认配置)
1.3典型单元文件示例(nginx.service)
下面是一个典型的 Nginx 的 systemd 单元配置文件,用于管理 Nginx 服务的启动、停止和重启等行为。
[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/bin/kill -s HUP $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
关于这个文件的写法,下一篇公众号专门来说明,下面先解释这个服务单元文件的每一行的含义:
它分三个部分:
[Unit]
部分
定义服务的基本信息和依赖关系。
-
Description=A high performance web server and a reverse proxy server
- 描述该服务的作用,这里说明 Nginx 是一个高性能 Web 服务器和反向代理服务器。
-
After=network.target
- 表示 Nginx 应该在
network.target
(网络服务)启动 之后 再启动,确保网络可用后再运行 Web 服务。
- 表示 Nginx 应该在
[Service]
部分
定义服务的运行行为,包括启动、停止、重启等命令。
-
Type=forking
- 表示 Nginx 以 守护进程(daemon) 方式运行(即主进程会 fork 子进程),systemd 需要跟踪主进程。
-
PIDFile=/run/nginx.pid
- 指定 Nginx 主进程的 PID 文件路径,systemd 通过该文件获取进程 ID 以管理服务。
-
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
- 启动前检查 :在正式启动前,先运行
nginx -t -q
测试配置文件语法是否正确(-q
表示静默模式)。
- 启动前检查 :在正式启动前,先运行
-
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
- 启动命令 :运行 Nginx,并通过
-g
传递全局配置参数(daemon on
表示以守护进程运行,master_process on
启用主进程模式)。
- 启动命令 :运行 Nginx,并通过
-
ExecReload=/bin/kill -s HUP $MAINPID
- 重载命令 :发送
HUP
信号(平滑重启)给 Nginx 主进程($MAINPID
是 systemd 自动替换的变量,表示主进程 PID)。
- 重载命令 :发送
-
PrivateTmp=true
- 启用私有临时目录(
/tmp
),增强安全性,防止服务间临时文件冲突。
- 启用私有临时目录(
[Install]
部分
定义服务的安装目标(何时/如何被启用)。
-
WantedBy=multi-user.target
-
表示当系统进入 多用户模式(命令行模式) 时,自动启动 Nginx 服务。
-
该配置会在执行
systemctl enable nginx
时创建一个符号链接到multi-user.target.wants/
目录。
-
2.如何在 systemd 中列出活动服务
systemd 服务通过 systemctl 命令进行管理,如果直接运行不带参数的 systemctl 命令,它会默认执行 list-units 子命令,列出所有类型的 systemd 单元(如服务、套接字、目标等)。
想要列出服务,需要配合 --type
参数指定单元类型,具体操作如下:
systemctl --type=service
或者
systemctl list-units --type=service
这两条命令的输出结果是一样的:
[root@backup ~]# systemctl list-units --type=service
UNIT LOAD ACTIVE SUB DESCRIPTION
abrt-ccpp.service loaded active exited Install ABRT coredump hook
abrt-oops.service loaded active running ABRT kernel log watcher
abrt-xorg.service loaded active running ABRT Xorg log watcher
abrtd.service loaded active running ABRT Automated Bug Reporting Tool
accounts-daemon.service loaded active running Accounts Service
alsa-state.service loaded active running Manage Sound Card State (restore and store)
atd.service loaded active running Job spooling tools
auditd.service loaded active running Security Auditing Service
avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack
blk-availability.service loaded active exited Availability of block devices
bolt.service loaded active running Thunderbolt system service
chronyd.service loaded active running NTP client/server
colord.service loaded active running Manage, Install and Generate Color Profiles
containerd.service loaded active running containerd container runtime
crond.service loaded active running Command Scheduler
cups.service loaded active running CUPS Printing Service
dbus.service loaded active running D-Bus System Message Bus
gdm.service loaded active running GNOME Display Manager
gssproxy.service loaded active running GSSAPI Proxy Daemon
irqbalance.service loaded active running irqbalance daemon
iscsi-shutdown.service loaded active exited Logout off all iSCSI sessions on shutdown
kdump.service loaded active exited Crash recovery kernel arming
kmod-static-nodes.service loaded active exited Create list of required static device nodes for the current kernel
ksm.service loaded active exited Kernel Samepage Merging
......

关于上面输出结果解释如下:
-
UNIT:表示 systemd 单元的名称。
-
LOAD:显示该单元的配置文件是否已被 systemd 加载解析。
-
ACTIVE:单元当前的高层级状态(如运行中、已停止等)。
-
SUB:单元的低层级状态。活跃状态(ACTIVE)的单元可能处于"运行中"(running)或"已退出"(exited)等子状态,具体取决于服务类型。
可以看到,这个列表展示了系统中所有已加载的服务。不过需要注意的是,处于 ACTIVE 状态的 systemd 服务既可能是正在运行的,也可能是已成功执行后处于退出状态(exited)。
3.列出所有正在运行的 systemd 服务
活跃(ACTIVE)状态还能进一步细分为子状态,比如"运行中"(running)、"已退出"(exited)等。我们可以在使用 --state
参数时,直接指定这些子状态进行过滤。
如果要列出所有正在运行的 systemd 服务,可以加上 --state=running
参数:
systemctl list-units --type=service --state=running
这样,显示结果如下(这里列出部分):
[root@backup ~]# systemctl list-units --type=service --state=running
UNIT LOAD ACTIVE SUB DESCRIPTION
abrt-oops.service loaded active running ABRT kernel log watcher
abrt-xorg.service loaded active running ABRT Xorg log watcher
abrtd.service loaded active running ABRT Automated Bug Reporting Tool
accounts-daemon.service loaded active running Accounts Service
alsa-state.service loaded active running Manage Sound Card State (restore and store)
atd.service loaded active running Job spooling tools
auditd.service loaded active running Security Auditing Service
avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack
bolt.service loaded active running Thunderbolt system service
chronyd.service loaded active running NTP client/server
colord.service loaded active running Manage, Install and Generate Color Profiles
......
4.列出所有已加载的 systemd 服务(包括未活动的服务)
默认情况下,systemctl 命令仅显示已加载的单元和活动单元。
如果要列出所有已加载的服务,包括非活动服务,在命令中加上--all
参数:
systemctl list-units --all --type=service
这样就可以看到非活动的服务:
[root@backup ~]# systemctl list-units --all --type=service
UNIT LOAD ACTIVE SUB DESCRIPTION
abrt-ccpp.service loaded active exited Install ABRT coredump hook
abrt-oops.service loaded active running ABRT kernel log watcher
abrt-vmcore.service loaded inactive dead Harvest vmcores for ABRT
abrt-xorg.service loaded active running ABRT Xorg log watcher
abrtd.service loaded active running ABRT Automated Bug Reporting Tool
accounts-daemon.service loaded active running Accounts Service
alsa-restore.service loaded inactive dead Save/Restore Sound Card State
alsa-state.service loaded active running Manage Sound Card State (restore and store)
● apparmor.service not-found inactive dead apparmor.service
atd.service loaded active running Job spooling tools
auditd.service loaded active running Security Auditing Service
auth-rpcgss-module.service loaded inactive dead Kernel Module supporting RPCSEC_GSS
avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack
blk-availability.service loaded active exited Availability of block devices
bolt.service loaded active running Thunderbolt system service
chronyd.service loaded active running NTP client/server
● cloud-init-local.service not-found inactive dead cloud-init-local.service
colord.service loaded active running Manage, Install and Generate Color Profiles
......

5.列出所有非活动 systemd 服务
如果只想查看所有非活动服务,可以在--state=inactive参数:
systemctl list-units --all --type=service --state=inactive
[root@backup ~]# systemctl list-units --all --type=service --state=inactive
UNIT LOAD ACTIVE SUB DESCRIPTION
abrt-vmcore.service loaded inactive dead Harvest vmcores for ABRT
alsa-restore.service loaded inactive dead Save/Restore Sound Card State
● apparmor.service not-found inactive dead apparmor.service
auth-rpcgss-module.service loaded inactive dead Kernel Module supporting RPCSEC_GSS
● cloud-init-local.service not-found inactive dead cloud-init-local.service
cpupower.service loaded inactive dead Configure CPU power related settings
dm-event.service loaded inactive dead Device-mapper event daemon
dmraid-activation.service loaded inactive dead Activation of DM RAID sets
dracut-cmdline.service loaded inactive dead dracut cmdline hook
dracut-initqueue.service loaded inactive dead dracut initqueue hook
dracut-mount.service loaded inactive dead dracut mount hook
......
6.列出所有已安装的 systemd 服务(即使它们未加载)
每个 systemd 单元,无论是服务单元、套接字还是任何其他单元,都有一个单元文件:
systemctl list-unit-files --type=service
下面列出了每个服务单元对应的文件:
[root@backup ~]# systemctl list-unit-files --type=service
UNIT FILE STATE
abrt-ccpp.service enabled
abrt-oops.service enabled
abrt-pstoreoops.service disabled
abrt-vmcore.service enabled
abrt-xorg.service enabled
abrtd.service enabled
accounts-daemon.service enabled
alsa-restore.service static
alsa-state.service static
anaconda-direct.service static
anaconda-nm-config.service static
anaconda-noshell.service static
anaconda-pre.service static
[email protected] static
anaconda-sshd.service static
[email protected] static
......
7.列出将在每次启动时自动运行的所有 systemd 服务
要查看每次系统引导时将自动运行的所有 systemd 服务,请使用以下命令:
systemctl list-unit-files --type=service --state=enabled
如下,这些服务将在系统启动时自动激活:
[root@backup ~]# systemctl list-unit-files --type=service --state=enabled
UNIT FILE STATE
abrt-ccpp.service enabled
abrt-oops.service enabled
abrt-vmcore.service enabled
abrt-xorg.service enabled
abrtd.service enabled
accounts-daemon.service enabled
atd.service enabled
auditd.service enabled
[email protected] enabled
avahi-daemon.service enabled
bluetooth.service enabled
chronyd.service enabled
crond.service enabled
cups.service enabled
......
8.显示特定 systemd 服务的状态
可以通过下面命令,查看单一服务的状态:
systemctl status <service_name>
比如,要查看网络管理器服务:
[root@backup ~]# systemctl status NetworkManager.service
● NetworkManager.service - Network Manager
Loaded: loaded (/usr/lib/systemd/system/NetworkManager.service; enabled; vendor preset: enabled)
Active: active (running) since 二 2025-03-18 14:43:25 CST; 2 weeks 0 days ago
Docs: man:NetworkManager(8)
Main PID: 910 (NetworkManager)
Tasks: 3
Memory: 1.7M
CGroup: /system.slice/NetworkManager.service
└─910 /usr/sbin/NetworkManager --no-daemon
Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.
[root@backup ~]#
可以看到它提供了很多有用的信息,比如服务的状态、服务的手册页、它消耗的内存、进程 ID 等。