如何在 Ubuntu 22.04 上使用 systemctl 管理 systemd 服务教程
简介
Systemd 是许多现代 Linux 发行版提供核心功能的默认服务管理器,而 systemctl
是用户与 systemd 服务交互的方式。这使得 systemctl
成为 Linux 管理员工具箱中重要的一部分。
在本文中,我们将探讨如何使用 systemctl
在使用 systemd
的系统上执行常见的管理任务。我们将手把手教你如何在 Linux 服务器上使用 systemctl 管理 systemd 服务。
准备工作
服务器准备
必要前提:
- 一个充满求知欲的大脑。
- 一台 Linux 服务器(推荐腾讯云、阿里云或雨云等)。
我将以 雨云 为例,带大家创建一台自己的云服务器,以便学习本篇文章的内容。
注册链接: https://rainyun.ivwv.site
创建雨云服务器
以下步骤仅供参考,请根据实际需求选择配置。
- 点击 云产品 → 云服务器 → 立即购买。
- 选择距离你较近的区域,以保证低延迟。
- 按照自己需求选择配置,选择Ubuntu 22.04 版本,按照自己需求是否预装Docker。
- 最后按照提示进行购买。
- 购买后等待机器部署完毕,点击刚刚创建好的服务器,进入管理面板,找到远程连接相关信息。
- 我们使用
PowerShell
进行SSH
远程连接到服务器,Win+R
打开运行窗口,输入powershell
后点击确定。
- 输入
ssh root@你的服务器IP
例如ssh root@154.9.227.239
回车后,首次需要输入yes
,再次回车后即可登录服务器。
- 到此为止,我们的云服务器就远程连接上了。
安装和配置步骤
使用 Linux systemctl 命令检查服务状态
要检查特定服务的状态,通用的 systemctl
命令语法是:
systemctl status <servicename>
例如,要检查 ufw
防火墙的状态:
systemctl status ufw
输出应类似于:
在输出中,你不仅可以看到服务的状态和 PID,还可以看到来自 journalctl
的最近日志片段。
请注意,你还可以使用完整的 <servicename.service>
单元文件名(如 ufw.service
)来运行 systemctl status
命令和其他与服务相关的 systemctl
命令。
使用 Linux systemctl 命令显示服务的属性
Systemd 属性定义了有关单元行为的详细信息。例如,DefaultEnvironment
定义传递给进程的 环境变量。许多属性值在 systemd-system.conf 中定义。
要显示 systemd 服务的所有属性,请使用此通用命令语法:
systemctl show <servicename>
例如,要查看 apache2
的所有属性,请执行此命令:
systemctl show apache2
输出应类似于:
要显示特定属性,请使用 -p
开关指定它。例如,要显示 apache2
的 UMask
属性,请使用:
systemctl show -p UMask apache2
输出应类似于:
使用 Linux systemctl 命令启动和停止服务
现在,我们将使用 Linux systemctl
命令来演示使用 Apache Web 服务 apache2
作为示例来修改服务状态的不同方法。
停止服务
停止服务的通用语法是:
systemctl stop <servicename>
要停止 apache2
,请运行:
systemctl stop apache2
启动服务
启动服务的通用语法是:
systemctl start <servicename>
要启动 apache2
,请运行:
systemctl start apache2
重启服务
重启(停止然后启动)服务的通用语法是:
systemctl restart <servicename>
要重启 apache2
,请运行:
systemctl restart apache2
重新加载服务(重新读取配置文件)
要“重新加载”服务(这意味着使其重新读取配置文件而不重新启动),通用的 systemctl 命令语法是:
systemctl reload <servicename>
要重新加载 apache2
,请运行:
systemctl reload apache2
尝试重新加载服务,如果失败则回退到重新启动
并非所有服务都支持重新加载。如果尝试重新加载不支持重新加载的服务,可能会看到类似以下的错误:
systemctl reload-or-restart <servicename>
命令将:
- 尝试重新加载服务。如果重新加载成功,则退出。
- 如果重新加载失败且服务正在运行,则重新启动服务。
- 如果重新加载失败且服务未运行,则启动服务。
要在 apache2
上运行 reload-or-restart
命令,请使用:
systemctl reload-or-restart apache2
systemctl try-reload-or-restart <servicename>
命令类似,但不启动未运行的服务。对于 try-reload-or-restart
,逻辑是:
- 尝试重新加载服务。如果重新加载成功,则退出。
- 如果重新加载失败且服务正在运行,则重新启动服务。
- 如果重新加载失败且服务未运行,则退出而不启动服务。
使用 Linux systemctl 命令启用服务
要使服务在系统启动时自动启动,应启用该服务。启用服务的基本 systemctl
命令语法是:
systemctl enable <servicename>
例如,要启用 apache2
:
systemctl enable apache2
输出应类似于:
如果想同时启用并启动服务,可以像这样附加 --now
开关:
systemctl enable <servicename> --now
使用 Linux systemctl 命令禁用服务
如果服务当前在系统启动时启动,而你想禁用该行为,可以使用:
systemctl disable <servicename>
例如,要禁用 apache2
:
systemctl disable apache2
输出应类似于:
如果想同时禁用并停止服务,可以像这样附加 --now
开关:
systemctl disable <servicename> --now
使用 Linux systemctl 命令屏蔽服务
禁用的服务仍然可以手动启动。屏蔽服务会禁用它,并禁止用户或进程在不首先取消屏蔽它的情况下启动它。
屏蔽服务的通用命令是:
systemctl mask <servicename>
请注意,要屏蔽 systemd 服务,通常需要确保在 /etc/systemd/system/
中没有相应的 .service 文件。例如,要在我们的 Ubuntu 20.04 系统上屏蔽 apache2
,可以使用以下命令:
- 将
/etc/systemd/system/apache2.service
文件的名称更改(移动)为/etc/systemd/system/apache2.service.old
mv /etc/systemd/system/apache2.service /etc/systemd/system/apache2.service.old
- 使用 Linux
systemctl
命令屏蔽服务
systemctl mask apache2
输出应类似于:
使用 Linux systemctl 命令取消屏蔽服务
取消屏蔽已屏蔽的服务单元的通用命令语法是:
systemctl unmask <servicename>
例如,要取消屏蔽 apache2
,请运行此命令:
systemctl unmask apache2
输出应类似于:
Systemd 单元管理
现在,让我们看看用于处理 Systemd 单元的有用命令。
使用 Linux systemctl 命令列出单元
Systemd 单元 是大多数 systemctl
命令的目标。单元是纯文本文件,描述了诸如服务、套接字、设备或文件系统挂载点之类的资源。
Systemd 服务在以 .service 结尾的单元文件中定义。例如,sshd 的单元文件是 sshd.service
,RSYSLOG 的单元文件是 syslog.service
。
要列出系统上所有已加载的单元,请运行命令 systemctl
或 systemctl list-units
(两个命令执行相同的操作)。
输出应类似于:
以下是每列的含义:
- UNIT - systemd 单元的名称
- LOAD - 指示配置是
loaded
(systemd 解析并存储在内存中的配置)、error
、not-found
、bad-setting
还是masked
。 - ACTIVE - 指示单元的状态。示例状态包括
active
、inactive
和failed
。 - SUB - “子状态”的缩写,SUB 值显示有关单元状态的更详细信息。对于服务,常见的 SUB 值包括
running
、stop
和exited
。你可以使用命令systemctl --state=help
查看 systemd 单元的可用子状态。 - DESCRIPTION - systemd 单元的描述。
默认情况下,systemctl
和 systemctl list-units
输出仅显示已加载的单元。要显示所有可用单元,请添加 --all
选项。
systemctl list-units --all
你还可以使用 --state
和 --type
参数来过滤 systemctl
输出。
例如,要查看所有 active
和 loaded
服务单元,请使用:
systemctl list-units --state=active --type=service
使用 Linux systemctl 命令列出依赖项
你可以使用此通用的 systemctl
命令语法查看服务所依赖的其他单元:
systemctl list-dependencies <servicename>
例如,要查看 apache2
的依赖项:
systemctl list-dependencies apache2
输出应类似于:
使用 Linux systemctl 命令显示单元文件
systemctl cat
命令显示 systemd
正在主动使用的单元文件。此信息有助于确定是否已将对单元文件的更改加载到系统中。
使用 systemctl cat
命令显示单元文件的通用语法是:
systemctl cat <单元名称>
例如,要显示 apache2.service 的单元文件,请使用此命令:
systemctl cat apache2
输出应类似于:
使用 Linux systemctl 命令编辑单元文件
Linux systemctl
命令可以编辑定义服务的单元文件。服务单元文件使用 ini 样式格式,其中包含诸如 [Unit]
、[Install]
和 [Service]
之类的部分,这些部分定义了不同的单元特征和行为。
要编辑现有的服务单元文件,通用的命令语法是:
systemctl edit --full <servicename>
例如,要编辑 apache2.service
文件,请运行命令:
systemctl edit --full apache2
该单元文件将在你的默认文本编辑器中打开。
要创建新的单元文件片段而不是编辑现有单元文件,请省略 --full
开关,如下所示:
systemctl edit <servicename>
保存新片段将在 <servicename.d>
目录中创建一个 override.conf
文件。 override.conf
中的设置将取代默认单元文件中的设置。
例如,如果运行命令 systemctl edit apache2
,然后在片段中保存这些设置:
[Unit]
Description=The Pepper And Egg HTTP Server
将创建一个带有 override.conf
文件的 /etc/systemd/system/apache2.service.d/
目录。 override.conf
文件包含我们在使用 systemctl edit
命令后保存的确切内容。我们可以使用以下命令查看内容:
cat /etc/systemd/system/apache2.service.d/override.conf
输出应类似于:
我们可以使用此 systemctl
命令重新加载 apache2
服务单元,使其使用新设置:
systemctl reload apache2
要了解有关服务单元文件的更多信息,请参阅 systemd.unit 和 systemd.service。
使用 targets
Systemd targets 将单元分组在一起,并定义系统在启动时可以进入的不同状态。虽然这两个概念之间存在许多差异(有关目标的深入研究,请参阅 systemd.special 手册页),但 systemd targets 类似于 SysV init 系统“运行级别”。
在高层面上,我们可以如下映射 systemd targets 和运行级别:
*poweroff.target
映射到运行级别 0* - 此目标用于系统关闭。*rescue.target
映射到运行级别 1* - 此目标用于进入单用户模式。*multi-user.target
映射到运行级别 2-4* - 此目标用于进入没有图形界面的标准多用户模式。*graphical.target
映射到运行级别 5* - 此目标用于具有网络和显示管理器的多用户模式。*reboot.target
映射到运行级别 6* - 此目标用于重新启动系统。
要检查 systemd 系统上的当前“运行级别”(默认目标),请运行以下命令:
systemctl get-default
输出应类似于:
要列出所有目标,请运行此命令:
systemctl list-units --type target --all
输出应类似于:
要将目标设置为默认目标,通用的 systemctl 命令语法是:
systemctl set-default <target_name>.target
例如,要将默认目标设置为多用户模式,请运行命令:
systemctl set-default multi-user.target
你应该看到类似于以下的输出:
要立即切换到特定的运行级别(目标),通用命令是:
systemctl isolate <target_name>.target
例如,要将默认目标设置为多用户模式,请运行命令:
systemctl isolate multi-user.target
在远程主机上运行 systemctl 命令
默认情况下,systemctl
命令在执行命令的本地服务器上运行。要在远程服务器上执行 systemctl
命令,请使用 -H
或 --host
选项,并以 <username>@<hostname>
格式指定用户名和远程主机地址。
例如,要在 remotehost
上以 root
身份运行命令 systemctl status apache2
,请执行此命令:
systemctl status apache2 -H root@remotehost
root@remotehost password:
输出应类似于:
结尾
通过对如何使用 Linux systemctl
命令的深入了解,你可以在许多现代 Linux 系统上高效地管理服务。要了解有关 systemd 和 systemctl
的更多信息,请查看 systemd 手册页。
雨云 - 新一代云服务提供商: https://rainyun.ivwv.site
我的博客:https://blog.ivwv.site