Linux 服务(systemd)最完整使用文档
本文是一份工程级、可落地、覆盖 systemd 全部核心语法与机制的 Linux 服务文档,目标读者为:后端工程师、架构师、SRE、运维工程师。
适用于:CentOS / RHEL / Rocky / Alma / Ubuntu / Debian 等 systemd 体系。
一、Linux 服务的本质
1.1 什么是 Linux 服务(Service)
Linux 服务 = 由 init 系统托管的长期运行进程。
其核心职责包括:
- 启动(Start)
- 停止(Stop)
- 重启(Restart)
- 崩溃拉起(Auto Restart)
- 资源控制(CPU / Memory / IO)
- 生命周期编排
现代 Linux 统一由 systemd 承担该角色。
1.2 systemd 在系统中的地位
text
PID 1 = systemd
systemd 是:
- 系统的第一个进程
- 所有服务、定时任务、挂载、会话的管理者
任何一个 systemd 管理的服务,本质上都是 systemd 的"子进程树"。
二、Unit 的概念(systemd 的核心抽象)
2.1 什么是 Unit
Unit 是 systemd 的最小管理单元。
常见 Unit 类型:
| Unit 类型 | 说明 |
|---|---|
| service | 服务(最常用) |
| timer | 定时器(替代 cron) |
| socket | 套接字激活 |
| mount | 挂载点 |
| target | 逻辑分组 |
本文只聚焦 service unit。
2.2 service 文件位置
text
/etc/systemd/system/ # 用户自定义(最高优先级)
/lib/systemd/system/ # 系统 / 软件包提供
永远只在
/etc/systemd/system下创建或覆盖服务。
三、Service 文件完整结构
ini
[Unit]
Description=服务描述
After=network.target
[Service]
Type=simple
ExecStart=/path/to/app
Restart=on-failure
[Install]
WantedBy=multi-user.target
三个区块缺一不可。
四、[Unit] 区块 ------ 启动顺序与依赖
4.1 Description
ini
Description=Product Service
- 纯描述
- 用于
systemctl status
4.2 After / Before
ini
After=network.target
Before=nginx.service
只控制启动顺序,不保证依赖存在。
After ≠ Requires
4.3 Wants / Requires
ini
Wants=redis.service
Requires=mysql.service
| 指令 | 行为 |
|---|---|
| Wants | 弱依赖,失败不影响 |
| Requires | 强依赖,失败则本服务失败 |
4.4 常见组合(工程级)
ini
After=network-online.target
Wants=network-online.target
这是"网络已就绪"的正确写法。
五、[Service] 区块 ------ 服务的核心
这是 systemd 最复杂、最有价值的部分。
5.1 Type(极其重要)
ini
Type=simple | exec | forking | oneshot | notify
| Type | 说明 | 场景 |
|---|---|---|
| simple | 默认,前台进程 | Java / Go(推荐) |
| exec | 类似 simple | 较少使用 |
| forking | 后台 daemon | 旧式程序 |
| oneshot | 一次性任务 | 初始化脚本 |
| notify | sd_notify | 高级集成 |
90% 的现代服务:Type=simple
5.2 ExecStart
ini
ExecStart=/data/app/product.jar
规则:
- 必须是前台进程
- 不要加
& - 不要用
tail -f保活
5.3 ExecStop
ini
ExecStop=/data/app/stop.sh
- 优雅停止
- 可选
5.4 WorkingDirectory
ini
WorkingDirectory=/data/app
影响:
- 相对路径
- 日志文件
5.5 User / Group
ini
User=appuser
Group=appgroup
强烈建议:
禁止 root 运行业务服务
5.6 Environment / EnvironmentFile
ini
Environment=JAVA_OPTS=-Xms2g
EnvironmentFile=/etc/sysconfig/product
用于参数解耦。
5.7 Restart(稳定性核心)
ini
Restart=always | on-failure | no
推荐:
ini
Restart=always
5.8 RestartSec
ini
RestartSec=60
含义:
崩溃后等待 60 秒再拉起
Java 服务推荐 60~120 秒。
5.9 StartLimit(防止重启风暴)
ini
StartLimitIntervalSec=300
StartLimitBurst=3
含义:
- 5 分钟内最多 3 次
5.10 KillSignal / KillMode
ini
KillSignal=SIGTERM
KillMode=control-group
保证子进程一起退出。
5.11 TimeoutStopSec
ini
TimeoutStopSec=120
- 超时后 SIGKILL
- 给 JVM 足够时间
六、[Install] 区块 ------ 开机自启
6.1 WantedBy
ini
WantedBy=multi-user.target
等价于传统 runlevel 3。
6.2 启用服务
bash
systemctl daemon-reload
systemctl enable product.service
systemctl start product.service
七、systemctl 常用命令全集
bash
systemctl start xxx
systemctl stop xxx
systemctl restart xxx
systemctl status xxx
systemctl enable xxx
systemctl disable xxx
journalctl -u xxx -f
八、日志体系(journalctl)
bash
journalctl -u product.service
journalctl -u product.service -f
journalctl --since today
建议:
- journal + 文件日志并存
九、反模式(必须避免)
❌ tail -f 保活
❌ 后台进程 &
❌ systemd 管理脚本再起 Java
❌ 一个 service 起多个主进程
十、生产级 Java 服务模板
ini
[Unit]
Description=Product Service
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=appuser
WorkingDirectory=/data/product
ExecStart=/usr/bin/java -Xms4g -Xmx4g -jar product.jar
Restart=always
RestartSec=60
StartLimitIntervalSec=300
StartLimitBurst=3
KillMode=control-group
TimeoutStopSec=120
[Install]
WantedBy=multi-user.target
十一、一句话工程总结
systemd 不是"启动工具",而是 Linux 的服务编排内核
用好 systemd,等于你掌控了 Linux 的生产级运行模型。