Linux systemctl:检查和管理服务
systemctl 是一个用于检查 systemd 管理的服务和其他单元状态的命令,可以启动或停止它们,并设置是否在启动时启用。当前运行状态和启动时的启用状态是不同的,因此必须分别检查。
启动前
systemd 是 Linux 的系统和服务管理器,它管理的单元不仅包括服务(.service),还包括定时器和套接字。本文解释了如何在 Linux 上使用 systemd 管理系统服务。它不能直接用于使用其他初始化系统或 systemd 未运行的环境。有关详细命令,请参阅 官方 systemctl 手册 。
以下 apache2.service 是在 Ubuntu 上安装 Apache 时的示例。如果未安装,则无法找到该单元,并且名称可能因发行版而异。在操作之前,请检查实际的服务名称,由于停止正在运行的 Web 服务器或远程访问服务可能会断开您的连接,请使用安全的测试环境。通常以普通用户身份检查状态是可以的,但更改系统服务通常需要管理员权限。
检查服务状态和名称
分别检查当前加载的服务和已安装的服务单元文件。这两个列表的标准不同,因此结果可能不相同。
systemctl list-units --type=service --all
systemctl list-unit-files --type=service
第一个显示在 systemd 中加载的服务,包括未激活的单元。第二个显示已安装的服务单元文件及其启用状态,这对于查找尚未加载的服务也很有用。如果列表很长且分页器打开,按 q 退出。
例如,要检查 Apache 服务的状态和最近日志,请输入以下命令。
systemctl status apache2.service
systemctl is-active apache2.service
systemctl is-enabled apache2.service
在 status 输出中,Active: active (running) 表示服务正在运行,inactive 表示未激活,failed 表示失败。详细状态取决于服务类型。is-active 检查当前状态,is-enabled 检查启用状态。static 单元不能以常规方式启用,但可以由其他单元启动。
服务启动、停止、重启
以下命令实际上会改变服务状态。将示例服务名称替换为适合您系统的名称,并确保在执行之前停止服务是可接受的。
sudo systemctl start apache2.service
sudo systemctl stop apache2.service
sudo systemctl restart apache2.service
start 启动服务,stop 停止服务。restart 停止服务然后重启它,并且可以启动已停止的服务。仅执行必要的命令。每次操作后,请使用 systemctl status apache2.service 检查结果。即使是已经运行的服务,在重启期间连接也可能会暂时中断。
如果服务支持重新加载其自身设置,您可以使用 sudo systemctl reload apache2.service 重新应用设置。每个服务的支持情况和应用方法各不相同。重新加载和重启不是同一个操作,检查设置的方法应遵循服务的文档。
开机启用和当前运行状态
以下命令配置或删除连接,以便单元在启动过程中启动等。单独运行 enable 不会立即启动任何内容,单独运行 disable 不会立即停止已经运行的服务。
sudo systemctl enable apache2.service
sudo systemctl disable apache2.service
systemctl is-enabled apache2.service
只选择并执行必要的命令,并使用最后一个命令检查结果。enabled表示已启用,disabled表示已禁用。但是,由于其他单元或套接字/定时器的依赖,服务可能仍然会启动,因此不要将禁用解释为阻止所有启动路径。
要立即激活并启动,请使用sudo systemctl enable --now apache2.service;要立即停用并停止,请使用sudo systemctl disable --now apache2.service。检查每个命令的效果,并仅在测试环境中练习。
出现问题时需要检查的内容
检查失败单元列表和特定服务的最近日志。日志可能包含敏感信息,因此在共享之前请审查内容。
systemctl --failed
sudo journalctl -u apache2.service -n 50 --no-pager
如果找不到服务,请检查服务名称以及是否已安装。如果启动失败,请检查status和日志以查看配置错误、依赖的服务、端口冲突或权限问题。masked状态表示启动被阻止,因此在确定原因之前不要随意解除屏蔽。消息和解决方案可能因发行版和服务设置而异。
如果您已更改单元文件
如果您修改了systemd单元文件或drop-in配置,请使用以下命令让systemd重新读取单元定义。
sudo systemctl daemon-reload
此命令不会重新启动服务本身,也不会使服务重新加载其配置文件。如果需要将更改应用到正在运行的服务,可能需要对该服务和更改执行单独的重启或重载。在进行更改之前,请备份配置,并确保您知道如何恢复到原始状态。




