Ubuntu 如何使用 systemd 管理服务

在现代 Ubuntu Server(从 15.04 开始全面采用,24.04 LTS 及后续版本完全基于 systemd)中,systemd 是系统的初始化进程(PID 1),同时也是最核心的服务管理器。它负责启动、停止、重启、监控、依赖管理、日志收集、资源限制等几乎所有与服务相关的功能。

相比旧的 SysV init 或 Upstart,systemd 的最大优势在于:

  • 并行启动(大幅缩短开机时间)
  • 声明式配置(.service 文件)
  • 强大的依赖关系表达
  • 原生 cgroups 集成(资源控制)
  • 内置 socket 激活、定时任务、挂载管理等
  • 与 journalctl 无缝集成

以下内容聚焦 Ubuntu Server 上最常用、最实用的 systemd 服务管理操作与原理。

一、systemd 单元(Unit)类型速览

单元类型文件后缀主要用途常见例子
Service.service管理系统守护进程nginx.service、ssh.service
Socket.socketsocket 激活(按需启动服务)docker.socket
Timer.timer定时任务(替代 cron 的现代方式)logrotate.timer
Target.target逻辑分组,类似运行级别multi-user.target
Mount.mount自动挂载文件系统mnt-data.mount
Path.path监控文件/目录变化触发服务很少直接用

日常运维 90% 以上只接触 .service 和 .timer。

二、核心命令速查表

操作命令示例说明
查看服务状态systemctl status nginx最常用,显示最近日志、PID、内存等
启动服务systemctl start nginx立即启动,不影响开机自启
停止服务systemctl stop nginx立即停止
重启服务systemctl restart nginx停止→启动
重新加载配置(不中断)systemctl reload nginxNginx/Apache 等支持 graceful reload
设置开机自启systemctl enable nginx创建符号链接到 multi-user.target.wants
取消开机自启systemctl disable nginx删除符号链接
同时启用并立即启动systemctl enable --now nginx常用新装服务后一步到位
查看所有已启用服务`systemctl list-unit-files --type=servicegrep enabled`
查看正在运行的服务systemctl list-units --type=service --state=running只看活跃服务
查看服务依赖关系systemctl list-dependencies nginx看到它依赖什么、被谁依赖
查看失败的服务systemctl --failed快速定位启动失败的服务

三、常用服务管理场景与最佳实践

1. 查看详细状态与最近日志(最常用操作)

Bash
sudo systemctl status ssh
# 或加 -l(完整日志) -n 50(最后50行)
sudo systemctl status ssh -l -n 50

输出包含:

  • Loaded:单元文件路径及启用状态
  • Active:active (running) / inactive / failed / activating 等
  • Main PID
  • Tasks / Memory / CPU 使用
  • 最近 10 行 journal 日志

2. 强制杀死失控服务

如果服务卡死、不响应 stop:

Bash
sudo systemctl kill -s SIGKILL nginx
# 或直接 kill 主进程(不推荐,先尝试 stop)

3. 查看/修改服务配置文件

Ubuntu 的服务文件主要位于两个路径:

  • /lib/systemd/system/ 或 /usr/lib/systemd/system/:系统自带(deb 包安装)
  • /etc/systemd/system/:用户自定义或覆盖(优先级更高)

查看 Nginx 示例:

Bash
systemctl cat nginx
# 会显示所有 drop-in 覆盖后的最终内容

想修改默认行为(例如加环境变量、修改 ExecStart、加资源限制):

  1. 创建覆盖目录:sudo systemctl edit nginx
  2. 在编辑器中写入 [Service] 段落的内容,例如:
text
[Service]
Environment="http_proxy=http://127.0.0.1:7890"
LimitNOFILE=65535
Restart=always
RestartSec=5s

保存后自动创建 /etc/systemd/system/nginx.service.d/override.conf

  1. 重新加载配置:sudo systemctl daemon-reload

4. 资源限制(cgroups v2 时代)

Ubuntu 24.04+ 默认使用 cgroup v2,支持更细粒度的限制。

在 override 文件中添加:

text
[Service]
MemoryMax=2G
CPUQuota=150%          # 限制使用 1.5 个核心
IOWeight=300           # 磁盘 IO 权重(默认 100)

5. socket 激活服务(高级但实用)

典型例子:Docker 默认使用 socket 激活。

原理:先启动 .socket 单元监听端口,当有连接进来时才启动对应的 .service,节省资源。

查看:

Bash
systemctl status docker.socket

6. 定时任务(现代替代 cron)

创建 /etc/systemd/system/backup.timer:

text
[Unit]
Description=Daily backup

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

对应服务文件 backup.service 中写实际执行命令。

启用:sudo systemctl enable --now backup.timer

四、常见误区与注意事项

  • systemctl daemon-reload 后才生效修改过的单元文件
  • enable 只影响开机自启,不启动当前实例(要加 --now)
  • restart 会中断连接,reload 通常不中断(服务需支持)
  • 第三方 snap 服务用 snap services 查看,不在 systemctl 里
  • Docker/Kubernetes 容器服务通常有自己的管理方式,但底层仍是 systemd 单元

掌握 systemd 后,你会发现它几乎取代了 service、chkconfig、init.d 脚本、部分 cron、at 等旧工具,成为 Ubuntu Server 服务管理的统一入口。

最实用的日常口诀:

“status 看状态,start/stop/restart 控生死,enable/disable 管开机,edit 加 override,daemon-reload 刷新配置”

熟练使用这些命令 + journalctl 组合,你就能高效管理 Ubuntu Server 上的几乎所有后台服务。

THE END