eskysky
发布于 2026-11-15 / 6 阅读
0

使用systemd部署与运维Spring Boot应用

Spring Boot应用打包成可执行JAR后,可以直接用 java -jar 运行。但在生产环境里,建议使用注册成Linux的systemd服务启动。

本文示例应用名及服务名为demo-app,操作时请根据实际路径和应用名进行替换。

示例环境

操作系统:Rocky Linux

Java安装目录:/usr/local/java/jdk-17/bin/java

Spring Boot应用名称:demo-app

Spring Boot应用路径:/opt/demo-app/demo-app.jar

堆转储目录:/opt/demo-app/dump

注意:堆转储目录需提前创建,用于存放JVM发生OOM时自动生成的DUMP文件,便于后续排查内存溢出原因,创建目录命令如下:

mkdir -p /opt/demo-app/dump

如果不知道Java安装目录,可执行以下命令查询(此命令查询出的是JDK根目录,后续配置文件中需填写Java可执行文件的绝对路径 java.home/bin/java):

java -XshowSettings:properties -version 2>&1 | grep 'java.home'

 本文实现的功能

1.使用systemd命令启停应用

2.开机自启动应用

3.内存溢出时自动转储堆

编写systemd unit配置文件

执行以下命令在/etc/systemd/system/目录下创建配置文件

sudo vim /etc/systemd/system/demo-app.service

配置文件内容如下:

[Unit]
# 服务描述,显示在 systemctl status 等输出中
Description=demo-app

# 启动顺序:等日志和网络就绪后再启动
After=syslog.target network.target


[Service]
# 运行身份:示例用 root 简化演示
# 生产环境建议创建专用用户,如 User=demo,并 chown 应用目录
User=root
Group=root

# 服务类型:等待 java 可执行文件 exec 成功后才认为启动完成
Type=exec

# 启动命令:JVM 参数必须写在 -jar 之前
# 各参数含义(按顺序对应下面的续行):
#   -Duser.timezone=Asia/Shanghai          设置 JVM 默认时区
#   -XX:+HeapDumpOnOutOfMemoryError        OOM 时自动生成堆转储
#   -XX:HeapDumpPath=/opt/demo-app/dump    堆转储输出目录(需提前创建)
#   -jar /opt/demo-app/demo-app.jar        要运行的可执行 JAR
# 注意:续行中间不能插入注释行,否则会打断续行拼接
ExecStart=/usr/local/java/jdk-17/bin/java \
    -Duser.timezone=Asia/Shanghai \
    -XX:+HeapDumpOnOutOfMemoryError \
    -XX:HeapDumpPath=/opt/demo-app/dump \
    -jar /opt/demo-app/demo-app.jar

# 进程工作目录,影响应用内相对路径和日志落点
WorkingDirectory=/opt/demo-app

# 声明退出码 143 也算正常退出
# 143 = 128 + 15,15 是 SIGTERM;systemctl stop 时 Java 优雅关闭正以 143 退出
# 不配置此项,手动停止会被 systemd 判为失败,并可能被 Restart 自动拉起
SuccessExitStatus=143

# 仅在非正常退出(非 0 退出码、被信号杀死等)时自动重启
# 配合 SuccessExitStatus=143,手动 stop 不会被误判为失败而重启
Restart=on-failure

# 重启前等待 10 秒,避免崩溃循环刷爆日志、占满 CPU
RestartSec=10

# 停止时最多等 30 秒,超时后发 SIGKILL 强杀
# 若应用开启 graceful shutdown,此值应大于应用的停机超时(默认 30s)
TimeoutStopSec=30


[Install]
# 设置开机自启:systemctl enable 时在 multi-user.target.wants 下创建符号链接
# 系统进入多用户模式时自动拉起本服务
WantedBy=multi-user.target

编辑后需执行以下命令重新加载配置才可生效:

# 重新加载 unit 文件(新建/修改 .service 后必须执行)
sudo systemctl daemon-reload

常用运维命令

启动服务:

systemctl start demo-app

停止服务

systemctl stop demo-app

重启服务

systemctl restart demo-app

设置开机自启,并立即启动服务(首次部署执行)

systemctl enable --now demo-app

查看服务状态

systemctl status demo-app

查看实时日志

journalctl -u demo-app -f

校验配置文件语法

systemd-analyze verify /etc/systemd/system/demo-app.service

更新应用的步骤

更新应用时先停止服务,再替换JAR包,最后启动服务即可。