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包,最后启动服务即可。