第 10 章 管理 systemd
要管理系统的关键方面,请使用 systemd。systemd 是 Red Hat Enterprise Linux 的系统和服务管理器。它提供了控制、报告和系统初始化的工具和服务。
systemd 管理的基本对象是 systemd 单元,表示系统资源和服务。systemd 单元由定义和管理特定任务的名称、类型和配置文件组成。您可以使用单元文件来配置系统行为。您可以在多个目录中找到单元文件。系统上的 systemd.unit (5) 手册页列出了这些目录及其负载顺序。systemd 的主要功能是:
- 在启动过程中并行启动系统服务
- 按需激活守护进程
- 基于依赖项的服务控制逻辑
systemd 管理器支持多种单元类型,包括以下类型:
- 服务
- 控制和管理单个系统服务。
- 目标
- 表示定义系统状态的一组单元。
- 设备
- 管理硬件设备及其可用性。
- Mount
- 处理文件系统挂载。
- 计时器
- 规划任务以在特定间隔运行。
10.1. 使用 systemctl 管理系统服务 复制链接链接已复制到粘贴板!
作为系统管理员,您可以使用 systemctl 工具管理系统服务。您可以执行各种任务,如启动、停止、重启运行的服务、启用和禁用服务以在引导时启动、列出可用的服务以及显示系统服务状态。
10.1.1. 列出系统服务 复制链接链接已复制到粘贴板!
您可以列出所有当前载入的服务单元,并显示所有可用服务单元的状态。
流程
使用 systemctl 命令执行以下任务:
列出所有当前载入的服务单元:
$ 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 abrtd.service loaded active running ABRT Automated Bug Reporting Tool ... systemd-vconsole-setup.service loaded active exited Setup Virtual Console tog-pegasus.service loaded active running OpenPegasus CIM Server LOAD = Reflects whether the unit definition was properly loaded. ACTIVE = The high-level unit activation state, or a generalization of SUB. SUB = The low-level unit activation state, values depend on unit type. 46 loaded units listed. Pass --all to see loaded but inactive units, too. To show all installed unit files use 'systemctl list-unit-files'默认情况下,
systemctl list-units命令只显示活跃的单位。对于每个服务单元文件,命令提供以下参数的概述:UNIT- 服务单元的全名
LOAD- 配置文件的负载状态
ACTIVE或SUB- 当前高级别和低级单元文件激活状态
DESCRIPTION- 单元目的和功能的简短描述
使用带有
--all或-a命令行选项的命令,列出 所有载入的单元,而不考虑其状态:$ systemctl list-units --type service --all列出所有可用服务单元的状态( enabled 或 disabled):
$ systemctl list-unit-files --type service UNIT FILE STATE abrt-ccpp.service enabled abrt-oops.service enabled abrtd.service enabled ... wpa_supplicant.service disabled ypbind.service disabled 208 unit files listed.对于每个服务单元,这个命令会显示:
UNIT FILE- 服务单元的全名
STATE- 服务单元是否已启用或禁用,以便在引导时自动启动的的信息
10.1.2. 显示系统服务状态 复制链接链接已复制到粘贴板!
您可以检查任何服务单元以获取详细信息,并验证服务的状态,其是否已启用为在引导时启动还是当前正在运行。您还可以查看在特定的服务单元之后或之前启动的服务。
流程
显示与系统服务相应的服务单元的详细信息:
$ systemctl status <name>.service将
<name>替换为您要检查的服务单元的名称(例如:gdm)。这个命令显示以下信息:
- 所选服务单元的名称,后跟一个简短描述
- 可用服务单元信息中 中描述的一个或多个字段
-
服务单元的执行:如果单元由
root用户执行 最新的日志条目
表 10.1. 可用的服务单元信息 项 描述 Loaded是否服务单元已载入的信息,单元文件的绝对路径,以及是否在引导时启动该单元的说明。
Active服务单元是否在运行的信息,后面有一个时间戳。
Main PID进程 ID 和相应系统服务的名称。
Status相关系统服务的额外信息。
Process有关相关进程的附加信息。
CGroup有关相关的控制组(
cgroups)的额外信息。
验证特定的服务单元是否正在运行:
$ systemctl is-active <name>.service确定是否在引导时启用了特定的服务单元:
$ systemctl is-enabled <name>.service注意如果指定的服务单元正在运行或已启用,则
systemctl is-active和systemctl is-enabled命令都会返回0退出状态 0。检查在指定服务单元前
systemd启动哪些服务# systemctl list-dependencies --after <name>.service例如,要查看在
gdm之前启动的服务的列表,请输入:# systemctl list-dependencies --after gdm.service gdm.service ├─dbus.socket ├─getty@tty1.service ├─livesys.service ├─plymouth-quit.service ├─system.slice ├─systemd-journald.socket ├─systemd-user-sessions.service └─basic.target [output truncated]检查在指定服务单元后
systemd启动哪些服务:# systemctl list-dependencies --before <name>.service例如,要查看在
gdm后systemd启动的服务列表,请输入:# systemctl list-dependencies --before gdm.service gdm.service ├─dracut-shutdown.service ├─graphical.target │ ├─systemd-readahead-done.service │ ├─systemd-readahead-done.timer │ └─systemd-update-utmp-runlevel.service └─shutdown.target ├─systemd-reboot.service └─final.target └─systemd-reboot.service
10.1.3. 启动和停止 systemd 单元 复制链接链接已复制到粘贴板!
您可以使用 systemctl start 命令在当前会话中启动系统服务。
先决条件
- 您有 Root 访问权限。
流程
在当前会话中启动一个系统服务:
# *systemctl start <systemd_unit> *将
<systemd_unit>替换为您要启动的服务单元的名称(例如httpd.service)。注意在
systemd中,服务之间存在正和负的依赖项。启动一个特定的服务可能需要启动一个或多个其他服务(正依赖项)或停止一个或多个服务(负依赖项)。当您尝试启动一个新服务时,
systemd会自动解析所有依赖项,而不明确通知用户。这意味着,如果您已运行了一个服务,并且您尝试使用负依赖项启动另一个服务,则第一个服务会自动停止。例如,如果您正在运行
sendmail服务,并且您试图启动postfix服务,systemd首先自动停止sendmail,因为这些服务会冲突,且无法在同一端口上运行。
10.1.4. 停止一个系统服务 复制链接链接已复制到粘贴板!
如果要在当前会话中停止系统服务,请使用 systemctl stop 命令。
先决条件
- 根访问权限
流程
停止一个系统服务:
# systemctl stop <name>.service将
<name>替换为您要停止的服务单元的名称(例如:bluetooth)。
10.1.5. 重启并重新加载系统服务 复制链接链接已复制到粘贴板!
您可以使用 restart 命令在当前会话中重启系统服务,以执行以下操作:
- 在当前会话中停止所选服务单元,并立即再次启动它。
- 仅在相应的服务已在运行时重启服务单元。
- 重新加载系统服务的配置,而不中断其执行。
先决条件
- 您有 Root 访问权限。
流程
重启一个系统服务:
# systemctl restart <name>.service使用您要重启的服务单元的名称替换
<name>(例如httpd)。如果所选服务单元没有运行,这个命令会启动它。
仅在相应的服务已在运行时重启服务单元:
# systemctl try-restart <name>.service重新载入配置而不中断服务执行:
# systemctl reload <name>.service注意不支持此功能的系统服务忽略此命令。要重新启动这些服务,请改为使用
reload-or-restart和reload-or-try-restart命令。
10.1.6. 使系统服务在引导时启动 复制链接链接已复制到粘贴板!
您可以使服务在引导时自动启动,这些更改将在下次重启时应用。
先决条件
- 您有 Root 访问权限。
流程
验证单元是否已屏蔽:
# systemctl status <systemd_unit>如果这个单元已屏蔽,请首先取消屏蔽:
# systemctl unmask <systemd_unit>启用服务,以便在引导时启动:
# systemctl enable <systemd_unit>将
<systemd_unit>替换为您要启用的服务单元的名称(例如httpd)。
(可选)将 --now 选项传给命令,以便立即启动单元。
10.1.7. 禁止一个系统服务在引导时启动 复制链接链接已复制到粘贴板!
您可以防止服务单元在引导时自动启动。如果您禁用某个服务,它不会在引导时启动,但可以手动启动。您还可以屏蔽服务,使其无法手动启动。屏蔽是一种禁用服务的方法,使该服务能够永久不可用,直到再次屏蔽该服务。
先决条件
- 您有 Root 访问权限。
流程
禁用要在引导时启动的服务:
# systemctl disable <name>.service将
<name>替换为您要禁用的服务单元的名称(例如:bluetooth)。可选,如果服务当前正在运行,传递--now命令也会停止服务。可选:要防止单元被管理员意外启动,或者作为其它单元的依赖项启动,请屏蔽该服务:
# systemctl mask <name>.service