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

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

相关推荐
宇钶宇夕2 小时前
CoDeSys入门实战一起学习(五):CoDeSys V3 车库门控制编程全解析系列(手册基础第五篇)
运维·自动化
xin_nai2 小时前
TCP/IP协议
服务器·网络·tcp/ip
不染尘.2 小时前
Linux的基本管理及命令(下)
linux·windows·ssh
IT 行者2 小时前
Spring Security OAuth2 ID Token 生成机制深度解析
服务器·spring
三花猫咪2 小时前
UBUNTU串口打印终端,X86主机变开发板
linux·运维·嵌入式硬件·ubuntu
HalvmånEver2 小时前
Linux:深入剖析 System V IPC上(进程间通信八)
linux·运维·数据库·c++·system v·管道pipe
EndingCoder2 小时前
泛型类和高级用法
linux·运维·前端·ubuntu·typescript
BIBI20492 小时前
CentOS 7 安装 MongoDB
linux·mongodb·centos·nosql·环境搭建·安装教程·服务器运维
chenzhiyuan20182 小时前
钡铼技术ARMxy系列BL440究竟多适合作为具身机器人核心控制器?
linux