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 | .socket | socket 激活(按需启动服务) | 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 nginx | Nginx/Apache 等支持 graceful reload |
| 设置开机自启 | systemctl enable nginx | 创建符号链接到 multi-user.target.wants |
| 取消开机自启 | systemctl disable nginx | 删除符号链接 |
| 同时启用并立即启动 | systemctl enable --now nginx | 常用新装服务后一步到位 |
| 查看所有已启用服务 | `systemctl list-unit-files --type=service | grep enabled` |
| 查看正在运行的服务 | systemctl list-units --type=service --state=running | 只看活跃服务 |
| 查看服务依赖关系 | systemctl list-dependencies nginx | 看到它依赖什么、被谁依赖 |
| 查看失败的服务 | systemctl --failed | 快速定位启动失败的服务 |
三、常用服务管理场景与最佳实践
1. 查看详细状态与最近日志(最常用操作)
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:
sudo systemctl kill -s SIGKILL nginx
# 或直接 kill 主进程(不推荐,先尝试 stop)3. 查看/修改服务配置文件
Ubuntu 的服务文件主要位于两个路径:
- /lib/systemd/system/ 或 /usr/lib/systemd/system/:系统自带(deb 包安装)
- /etc/systemd/system/:用户自定义或覆盖(优先级更高)
查看 Nginx 示例:
systemctl cat nginx
# 会显示所有 drop-in 覆盖后的最终内容想修改默认行为(例如加环境变量、修改 ExecStart、加资源限制):
- 创建覆盖目录:sudo systemctl edit nginx
- 在编辑器中写入 [Service] 段落的内容,例如:
[Service]
Environment="http_proxy=http://127.0.0.1:7890"
LimitNOFILE=65535
Restart=always
RestartSec=5s保存后自动创建 /etc/systemd/system/nginx.service.d/override.conf
- 重新加载配置:sudo systemctl daemon-reload
4. 资源限制(cgroups v2 时代)
Ubuntu 24.04+ 默认使用 cgroup v2,支持更细粒度的限制。
在 override 文件中添加:
[Service]
MemoryMax=2G
CPUQuota=150% # 限制使用 1.5 个核心
IOWeight=300 # 磁盘 IO 权重(默认 100)5. socket 激活服务(高级但实用)
典型例子:Docker 默认使用 socket 激活。
原理:先启动 .socket 单元监听端口,当有连接进来时才启动对应的 .service,节省资源。
查看:
systemctl status docker.socket6. 定时任务(现代替代 cron)
创建 /etc/systemd/system/backup.timer:
[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 上的几乎所有后台服务。
