- 高级撰稿人
- 作者
Systemd 是大多数现代 Linux 发行版中默认使用的系统与服务管理器。它负责在启动过程中加载系统并管理运行中的服务。它接管进程 ID 1(PID 1),这意味着它是 Linux 内核启动的第一个用户空间进程,并将持续运行直至系统关闭。
与 SysV 等传统 init 系统不同,systemd 采用单元(unit)来定义和管理系统资源。每个单元通过配置文件(即单元文件)描述,该文件告知 systemd 如何管理该资源。单元可代表服务、设备、挂载点,甚至可表示称为目标(target)的单元组,这些目标在启动过程中充当检查点。
与systemd交互的核心工具是systemctl,它支持启动、停止、重启、启用、禁用服务及其他单元,并可查看其运行状态。
要查看与systemd及其服务相关的系统日志,可使用journalctl命令,该命令能显示systemd日志中的消息。
本指南将深入探讨如何使用systemctl命令——这款管理Linux初始化系统的工具。同时将探讨如何控制服务、查看状态、调整系统状态以及与配置文件交互。
需特别说明:尽管systemd是众多主流Linux发行版的默认初始化系统,但并非所有发行版都采用它。若遇到“bash: systemctl: command not found”等错误,说明您的系统可能依赖其他初始化系统,systemctl不可用。
初始化系统的核心职责之一,是在 Linux 内核加载完成后启动关键组件。这些组件通常称为用户空间进程,包含维持系统平稳运行的各类服务和守护进程。初始化系统在系统运行期间也持续承担着控制这些服务的重要作用。
在 systemd 中,其管理的核心元素称为单元。单元通过名为单元文件的配置文件定义,每个文件指定特定资源的处理方式。资源类型由文件扩展名(后缀)标识。
针对服务管理,systemd使用服务单元,其文件名以.service结尾。但使用systemctl命令时通常可省略.service扩展名——systemd会自动识别为服务对象。
手动启动服务并触发单元文件中定义的操作时,请使用以下命令:
$ sudo systemctl start application.service
由于 systemd 能推断操作对象为服务,也可执行:
$ sudo systemctl start application
两种格式均有效,但为保持清晰度,本指南在处理服务单元时将始终包含 .service 后缀。
停止正在运行的服务命令如下:
$ sudo systemctl stop application.service
完全重启服务(即停止后重新启动)请使用:
$ sudo systemctl restart application.service
部分服务支持无需重启即可重新加载配置文件。执行配置文件重新加载请运行:
$ sudo systemctl reload application.service
若不确定服务是否支持重载,可使用更安全的组合命令:
$ sudo systemctl reload-or-restart application.service
该命令会尝试重载配置(若支持),否则直接重启服务。
前文介绍的命令用于管理当前会话中的服务,若需使服务在系统启动时自动运行,则需启用该服务。
系统ctl 启用服务(systemd enable service)
配置服务在启动时运行,请执行:
$ sudo systemctl enable application.service
该命令会在服务文件(通常位于 /lib/systemd/system/ 或 /etc/systemd/system/)与 systemd 启动时扫描的自动启动服务目录(常见形式如 /etc/systemd/system/some_target.target.wants)之间创建符号链接。
systemctl 禁用服务
要禁止服务在启动时运行,请使用:
$ sudo systemctl disable application.service
此操作将删除符号链接,systemd 便不再自动启动该服务。
请注意:启用服务仅将其加入启动计划,不会立即在当前会话中启动。若需立即启用并启动服务,需同时执行 enable 和 start 命令。
要检查服务是否运行并查看基本信息,可使用:
$ systemctl status application.service
该命令将显示服务状态(是否活动)、运行时长及最新日志条目等详细信息。
例如检查docker状态时,可能看到如下输出:
此摘要可快速评估服务健康状况,并突出显示存在的问题。
若仅需确认服务是否运行,可使用:
$ systemctl is-active application.service
该命令返回“active”或“inactive”状态,同时输出退出代码——0表示服务处于活动状态,此信息在脚本自动化检测时尤为实用。
要确认服务是否设置为开机启动,请运行:
$ systemctl is-enabled 应用程序.service
返回结果为 enabled 或 disabled,同上文,命令退出代码可指示结果状态。
最后,若需检查服务是否因启动或运行错误而失败,请使用:
$ systemctl is-failed 应用程序.service
若出现异常则返回 failed,正常运行时返回 active。若服务被主动停止,可能显示 inactive 或 unknown。退出代码 0 表示失败,1 则表示其他状态。
前文介绍了管理单个服务的命令,若需全面了解系统状态,systemctl 还提供相应命令。
要查看当前运行中的单元,可使用 list-units 命令:
$ systemctl list-units
这将显示所有由 systemd 实时管理的单元。输出格式如下:
各列含义说明:
默认情况下,此命令仅显示当前活动的单元。实际上,不带附加参数运行 systemctl 也会产生相同输出。
$ systemctl
若需查看systemd曾尝试加载或当前内存中存在的全部单元(包括未运行状态),可添加--all参数:
$ systemctl list-units --all
此命令将包含已运行后停止的单元,甚至包含systemd尝试加载但未找到的单元。
若需缩小范围,可按特定状态过滤。例如仅查看非活动单元:
$ systemctl list-units --all --state=inactive
也可按类型筛选。例如仅显示服务:
$ systemctl list-units --type=service
上述命令仅显示 systemd 曾交互过的单元(包括已加载或尝试运行的单元)。要查看系统中所有可用单元文件(无论 systemd 是否接触过),请使用:
$ systemctl list-unit-files
该命令将列出 systemd 目录中所有单元定义文件,包括 systemd 从未尝试加载的文件。输出格式如下:
包含两列信息:
状态含义说明:
此命令可获取系统中所有单元的完整清单,无论systemd是否实际使用过它们。
目前我们主要关注服务启动/停止操作,以及查看systemd单元及其文件的基本信息。但systemd还提供多项命令可深入解析单元信息并实现精准控制。
要查看systemd已加载到内存中的实际单元文件,可使用cat命令(该功能自systemd 209版本引入)。例如查看apache2服务的单元文件:
$ systemctl cat apache2.service
该命令将输出systemd当前识别的单元文件内容。当文件近期被修改或应用了自定义覆盖时,此功能尤为实用。显示内容反映了systemd所见文件的实时状态。
若需查看特定服务依赖的其他单元,list-dependencies命令可提供帮助。例如要查看 sshd 服务的依赖关系,请执行:
$ systemctl list-dependencies sshd.service
该命令将以树状结构展示 sshd.service 直接依赖或可选依赖的单元。systemd 目标(代表系统状态的特殊单元组合)也会显示其内部依赖关系。
若需显示所有递归依赖关系,可添加 --all 选项:
$ systemctl list-dependencies --all sshd.service
您也可反向查询依赖关系:通过添加 --reverse 标志可查看哪些单元依赖于指定服务:
systemctl list-dependencies --reverse sshd.service
若需检查哪些单元被配置为在目标服务之前或之后启动,可使用以下选项:
systemctl list-dependencies sshd.service --before
systemctl list-dependencies sshd.service --after
每个单元都包含控制 systemd 处理方式的多种属性。要查看特定单元的全部属性,请使用 show 命令。该命令以键值对格式呈现详细单元数据:
systemctl show sshd.service
此命令将输出数十项属性,包括该单元所属的目标、与其他单元的冲突情况及其依赖关系。
若需查看特定属性,可使用 -p 选项进行过滤。例如检查 sshd 服务与哪些单元存在冲突:
systemctl show sshd.service -p Conflicts
有时仅停止或禁用服务尚不足够——您可能需要彻底阻止其在任何情况下启动。此时便需使用屏蔽功能。当单元被屏蔽时,systemd 会将其链接至 /dev/null,从而有效阻止手动或自动启动。
屏蔽单元命令:
$ sudo systemctl mask apache2.service
执行后检查所有单元文件,可见 apache2.service 被标记为“被屏蔽”:
$ systemctl list-unit-files
若尝试启动被屏蔽的服务,systemd 将拒绝并显示错误:
$ sudo systemctl start apache2.service
要恢复服务启动能力,请执行:
$ sudo systemctl unmask apache2.service
此操作将解除屏蔽状态,使单元恢复常规状态,可像其他服务一样重新启动或启用。
虽然单元文件的精确结构和语法超出本指南范围,但 systemd 提供了内置工具供您直接进行修改。这些编辑功能自 systemd 218 版本起引入。
edit命令通过简洁界面实现单元文件修改。默认情况下,该命令会为待修改单元创建空白覆盖文件。例如创建nginx.service的覆盖文件:
$ sudo systemctl edit nginx.service
此操作将在/etc/systemd/system目录下创建以单元名加.d结尾的子目录(如nginx.service.d)。systemd 会在该目录下放置名为 override.conf 的文件,您可在其中添加自定义配置。
服务启动时,systemd 会将此覆盖文件与主单元文件合并,并优先应用覆盖文件中的设置。这使得无需直接编辑原始文件即可轻松调整特定选项。
若需修改完整单元文件而非创建小范围覆盖,可使用 --full 选项:
$ sudo systemctl edit --full nginx.service
此命令将当前完整文件加载至编辑器,便于进行全面修改。保存并关闭编辑器后,systemd 会将修改后的文件保存至 /etc/systemd/system 目录,该文件将优先于 /lib/systemd/system 中的默认文件生效。
若需撤销修改,只需删除覆盖目录或自定义单元文件本身。
删除覆盖目录:
$ sudo rm -r /etc/systemd/system/nginx.service.d
删除完整自定义单元文件:
$ sudo rm /etc/systemd/system/nginx.service
删除文件后需重新加载 systemd 以使其忽略已删除文件并恢复使用原始系统单元文件:
sudo systemctl daemon-reload
此操作可确保 systemd 不再查找或应用您已删除的修改。
在systemd中,目标代表特定系统状态,类似于传统初始化系统的运行级别。这些目标以特殊单元文件形式定义(后缀为.target),通过组合其他单元实现预期状态。
系统启动时进入默认目标,该目标决定启动后的系统状态。可通过以下命令查看当前默认目标:
$ systemctl get-default
若需更改默认目标(例如切换至图形桌面环境),请执行:
$ sudo systemctl set-default graphical.target
查看系统所有可用目标:
$ systemctl list-unit-files --type=target
仅查看当前活动目标:
$ systemctl list-units --type=target
可通过 isolate 命令将系统切换至不同目标,停止所有无关服务并仅启动新目标所需的服务。
例如从图形桌面环境切换至纯命令行环境:
$ sudo systemctl isolate multi-user.target
隔离前建议检查目标依赖的服务:
$ systemctl list-dependencies multi-user.target
此操作可避免误停关键服务。
Systemd 提供专属快捷命令处理关机、重启或进入救援模式等核心系统事件。这些命令会触发相应目标并通知所有登录用户,形成额外的沟通机制。
进入救援模式(单用户模式)可执行:
$ sudo systemctl rescue
此操作与隔离 rescue.target 效果相似,但额外具备通知当前用户的优势。
停止系统(终止所有进程但不关机):
$ sudo systemctl halt
执行完整系统关机:
$ sudo systemctl poweroff
重启机器:
$ sudo systemctl reboot
多数Linux系统同时提供直接关联systemd的传统命令,因此通常只需输入:
$ sudo reboot
这些命令与systemd无缝集成,确保系统事件的规范通信与规范处理。
保障systemd服务安全是防范攻击、未授权访问及意外损坏的关键步骤。以下是通过systemd强化服务的简化方案:
每个由systemd管理的服务都对应一个单元文件,该文件定义了服务的运行方式,包括启动流程、访问权限和资源限制。这些文件通常存储在/etc/systemd/system/目录下,可通过定制提升安全性。
本文介绍了 systemctl 命令的使用方法。systemctl 是 systemd 环境中管理服务与系统状态的核心工具,作为与系统核心进程交互的主要接口。此外,systemd 还包含其他辅助工具:journalctl 用于查看日志,loginctl 用于管理用户会话。掌握这些关联工具将助您更高效地管理系统。
您的业务是否已突破VPS主机的承载极限?立即升级至BlueServers的专用服务器,体验更强劲的性能!
让您的托管服务更上一层楼——立即探索BlueServers专用服务器!
Start for free and unlock high-performance infrastructure with instant setup.
您的意见有助于我们提供更好的服务。