15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用
31.10.2024

Systemctl 命令:如何在 Linux 中重启、重新加载和停止服务

对于任何Linux系统管理员来说,高效管理服务是最关键的技能之一。无论您是在VPS托管计划上运行高流量Web服务器,还是维护专用服务器环境,了解如何使用systemctl控制系统服务是绝对必要的。本综合指南涵盖了您需要了解的有关使用systemdsystemctl在Linux中重启、重新加载和停止服务的所有内容。

什么是systemd以及为什么它很重要?

systemd是几乎所有现代Linux发行版中使用的默认init系统和服务管理器,包括Ubuntu、Debian、CentOS、Rocky Linux、AlmaLinux和Fedora。它取代了SysVinit和Upstart等较旧的init系统,在Linux启动和进程管理方式上带来了重大改进。

systemd的关键功能

  • 并行服务启动 — 通过并发启动服务大幅减少启动时间
  • 按需服务激活 — 服务只在需要时启动,节省系统资源
  • 依赖关系管理 — 自动处理服务依赖关系和顺序
  • 集中式日志记录 — 与journald集成以实现统一的结构化日志管理
  • 基于Cgroup的资源控制 — 跟踪和限制每个服务的CPU、内存和I/O使用情况
  • Socket和D-Bus激活 — 启用高级进程间通信模式

理解systemd不仅仅是学术性的 — 它直接影响您的Linux环境的稳定性、性能和安全性。

什么是systemctl?

systemctl是与systemd交互的主要命令行界面。它允许管理员:

  • 启动、停止、重启和重新加载服务
  • 启用或禁用启动时的服务
  • 检查服务状态和查看日志
  • 管理系统目标(运行级别)
  • 重新加载systemd守护进程配置

所有修改系统状态的systemctl命令都需要root权限sudo访问权限。

用于服务管理的核心systemctl命令

1. 重启服务

重启服务会完全停止它,然后重新启动。这是以下情况下的首选操作:

  • 您已进行需要完整进程重启的配置更改
  • 服务已崩溃或变得无响应
  • 您需要在包升级后应用更新的二进制文件

语法:

sudo systemctl restart <service_name>

示例 — 重启Nginx Web服务器:

sudo systemctl restart nginx

示例 — 重启Apache Web服务器:

sudo systemctl restart apache2

示例 — 重启MySQL/MariaDB数据库:

sudo systemctl restart mysql

> 重要:重启服务会导致短暂中断。对于生产环境,在支持的情况下考虑使用reload以避免停机。

2. 重新加载服务

重新加载指示正在运行的服务重新读取其配置文件而不停止进程。这是应用配置更改而不产生停机时间的理想选择。

语法:

sudo systemctl reload <service_name>

示例 — 编辑Nginx配置后重新加载:

sudo systemctl reload nginx

示例 — 修改sshd_config后重新加载SSH守护进程:

sudo systemctl reload sshd

> 注意:并非所有服务都支持reload操作。如果服务未实现它,systemctl将返回错误。在这些情况下,请改用restart

专业提示 — 使用reload-or-restart以获得最大兼容性:

sudo systemctl reload-or-restart <service_name>

此命令首先尝试重新加载。如果服务不支持重新加载,它会自动回退到完整重启 — 使其成为脚本部署和自动化的最安全选择。

3. 停止服务

停止服务会立即终止它。当您需要将服务脱机进行维护、故障排除或重新配置时,请使用此选项。

语法:

sudo systemctl stop <service_name>

示例 — 停止Nginx Web服务器:

sudo systemctl stop nginx

示例 — 停止防火墙服务:

sudo systemctl stop ufw

> 警告:停止关键服务(例如远程服务器上的sshd)可能会将您锁定在系统之外。在停止基本服务之前,始终确保您有替代访问方法,例如控制台或带外管理。

4. 启动服务

如果服务当前未运行,请使用start命令启动它。

语法:

sudo systemctl start <service_name>

示例:

sudo systemctl start nginx

5. 在启动时启用服务

启用服务会创建必要的符号链接,以便systemd在系统启动期间自动启动它。

语法:

sudo systemctl enable <service_name>

示例:

sudo systemctl enable nginx

同时启用和启动(推荐):

sudo systemctl enable --now nginx

6. 在启动时禁用服务

禁用服务可防止其自动启动,但不会停止它(如果当前正在运行)。

语法:

sudo systemctl disable <service_name>

示例:

sudo systemctl disable bluetooth

同时禁用和停止:

sudo systemctl disable --now bluetooth

7. 检查服务状态

status命令是最常用的systemctl命令之一。它提供服务状态的实时快照,包括最近的日志条目。

语法:

sudo systemctl status <service_name>

示例 — 检查Nginx的状态:

sudo systemctl status nginx

示例输出:

● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2024-01-15 10:23:45 UTC; 2h 34min ago
       Docs: man:nginx(8)
    Process: 1234 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
   Main PID: 1235 (nginx)
      Tasks: 3 (limit: 4915)
     Memory: 6.2M
        CPU: 45ms
     CGroup: /system.slice/nginx.service
             ├─1235 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
             └─1236 "nginx: worker process"

输出包括:

  • Loaded — 单元文件是否已加载以及在启动时是否启用
  • Active — 当前运行状态(active (running)inactive (dead)failed等)
  • Main PID — 服务的主进程ID
  • Memory/CPU — 资源消耗指标
  • CGroup — 控制组层次结构
  • Recent logs — 最后几个日志条目以进行快速诊断

高级systemctl命令

检查服务是否活跃或启用

对于脚本和自动化中的使用,这些命令返回简单的布尔式退出代码:

# Check if a service is currently running
systemctl is-active nginx

# Check if a service is enabled at boot
systemctl is-enabled nginx

# Check if a service has failed
systemctl is-failed nginx

列出所有服务

# List all loaded and active units
systemctl list-units --type=service

# List all installed unit files and their states
systemctl list-unit-files --type=service

# List only failed services
systemctl --failed

重新加载systemd守护进程

创建或修改单元文件后,您必须重新加载systemd守护进程以识别更改:

sudo systemctl daemon-reload

屏蔽和取消屏蔽服务

屏蔽服务可防止其被手动或自动启动 — 即使由其他服务启动:

# Prevent a service from ever starting
sudo systemctl mask <service_name>

# Re-enable a masked service
sudo systemctl unmask <service_name>

快速参考:systemctl命令速查表

命令描述
systemctl start <service>启动已停止的服务
systemctl stop <service>停止正在运行的服务
systemctl restart <service>停止并重启服务
systemctl reload <service>重新加载配置而不停止
systemctl reload-or-restart <service>重新加载(如果支持),否则重启
systemctl enable <service>在启动时启用服务
systemctl disable <service>在启动时禁用服务
systemctl enable --now <service>启用并立即启动
systemctl disable --now <service>禁用并立即停止
systemctl status <service>显示服务状态和日志
systemctl is-active <service>检查服务是否正在运行
systemctl is-enabled <service>检查服务是否在启动时启动
systemctl is-failed <service>检查服务是否失败
systemctl list-units --type=service列出所有活跃服务
systemctl --failed列出所有失败的服务
systemctl daemon-reload重新加载systemd单元文件
systemctl mask <service>完全防止服务启动
systemctl unmask <service>从服务中移除屏蔽

服务器管理员的实际用例

场景1:应用Nginx配置更改

您已在Web服务器上编辑了/etc/nginx/nginx.conf。要应用更改而不断开活跃连接:

# First, test the configuration syntax
sudo nginx -t

# If the test passes, reload gracefully
sudo systemctl reload nginx

场景2:恢复失败的服务

服务已崩溃并显示failed状态:

# Check what went wrong
sudo systemctl status myapp.service

# View full logs for the service
sudo journalctl -u myapp.service -n 50 --no-pager

# Restart the service
sudo systemctl restart myapp.service

场景3:部署后设置新服务

在使用自定义单元文件部署新应用程序后:

# Reload systemd to recognize the new unit file
sudo systemctl daemon-reload

# Enable and start the service in one command
sudo systemctl enable --now myapp.service

# Verify it's running correctly
sudo systemctl status myapp.service

restart、reload和stop之间的区别 — 一览

操作进程已停止?停机时间?用例
stop维护、故障排除
restart是,然后重启短暂需要完整重启的配置更改
reload零停机时间的配置更改
reload-or-restart仅在需要时最小安全的自动化和脚本编写

跨不同托管环境管理服务

本指南中涵盖的systemctl命令在所有基于Linux的托管环境中通用。无论您是在

15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用