欢迎光临
我们一直在努力

Linux 服务(systemd)最完整使用文档

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 在系统中的地位

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 文件位置

/etc/systemd/system/ # 用户自定义(最高优先级)
/lib/systemd/system/ # 系统 / 软件包提供

永远只在 /etc/systemd/system 下创建或覆盖服务。


三、Service 文件完整结构

[Unit]
Description=服务描述
After=network.target

[Service]
Type=simple
ExecStart=/path/to/app
Restart=on-failure

[Install]
WantedBy=multi-user.target

三个区块缺一不可。


四、[Unit] 区块 —— 启动顺序与依赖

4.1 Description

Description=Product Service

  • 纯描述
  • 用于 systemctl status

4.2 After / Before

After=network.target
Before=nginx.service

只控制启动顺序,不保证依赖存在。

After ≠ Requires


4.3 Wants / Requires

Wants=redis.service
Requires=mysql.service

指令行为
Wants 弱依赖,失败不影响
Requires 强依赖,失败则本服务失败

4.4 常见组合(工程级)

After=network-online.target
Wants=network-online.target

这是“网络已就绪”的正确写法。


五、[Service] 区块 —— 服务的核心

这是 systemd 最复杂、最有价值的部分。


5.1 Type(极其重要)

Type=simple | exec | forking | oneshot | notify

Type说明场景
simple 默认,前台进程 Java / Go(推荐)
exec 类似 simple 较少使用
forking 后台 daemon 旧式程序
oneshot 一次性任务 初始化脚本
notify sd_notify 高级集成

90% 的现代服务:Type=simple


5.2 ExecStart

ExecStart=/data/app/product.jar

规则:

  • 必须是前台进程
  • 不要加 &
  • 不要用 tail -f 保活

5.3 ExecStop

ExecStop=/data/app/stop.sh

  • 优雅停止
  • 可选

5.4 WorkingDirectory

WorkingDirectory=/data/app

影响:

  • 相对路径
  • 日志文件

5.5 User / Group

User=appuser
Group=appgroup

强烈建议:

禁止 root 运行业务服务


5.6 Environment / EnvironmentFile

Environment=JAVA_OPTS=-Xms2g
EnvironmentFile=/etc/sysconfig/product

用于参数解耦。


5.7 Restart(稳定性核心)

Restart=always | on-failure | no

推荐:

Restart=always


5.8 RestartSec

RestartSec=60

含义:

崩溃后等待 60 秒再拉起

Java 服务推荐 60~120 秒。


5.9 StartLimit(防止重启风暴)

StartLimitIntervalSec=300
StartLimitBurst=3

含义:

  • 5 分钟内最多 3 次

5.10 KillSignal / KillMode

KillSignal=SIGTERM
KillMode=control-group

保证子进程一起退出。


5.11 TimeoutStopSec

TimeoutStopSec=120

  • 超时后 SIGKILL
  • 给 JVM 足够时间

六、[Install] 区块 —— 开机自启

6.1 WantedBy

WantedBy=multi-user.target

等价于传统 runlevel 3。


6.2 启用服务

systemctl daemon-reload
systemctl enable product.service
systemctl start product.service


七、systemctl 常用命令全集

systemctl start xxx
systemctl stop xxx
systemctl restart xxx
systemctl status xxx
systemctl enable xxx
systemctl disable xxx
journalctl -u xxx -f


八、日志体系(journalctl)

journalctl -u product.service
journalctl -u product.service -f
journalctl –since today

建议:

  • journal + 文件日志并存

九、反模式(必须避免)

❌ tail -f 保活
❌ 后台进程 &
❌ systemd 管理脚本再起 Java
❌ 一个 service 起多个主进程


十、生产级 Java 服务模板

[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 的生产级运行模型。

赞(0)
未经允许不得转载:171主机测评 » Linux 服务(systemd)最完整使用文档
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址