在 Linux 上实现 Spring Boot 程序的自动启动与守护运行
一、背景概述
在生产环境中部署 Spring Boot 应用时,开发者常常会面临以下问题:
-
服务器重启后程序不会自动恢复;
-
手动执行
java -jar需要登录终端; -
应用崩溃后无人值守无法自动重启;
-
日志输出被系统清理或丢失。
为了解决这些问题,我们通常需要将 Spring Boot 程序配置为 Linux 系统服务(Systemd Service),使其具备“自动启动 + 守护运行 + 日志独立管理”的能力。
二、基本环境说明
假设系统环境如下(可根据实际修改):
| 项目 | 路径或配置 |
|---|---|
| Spring Boot Jar 包 | /data/cloud/nbsaas-mall2-front.jar |
| Java 路径 | /data/tool/jdk-21.0.5+11/bin/java |
| 日志目录 | /data/cloud/logs |
| 启动 Profile | prod |
三、启动命令验证
在配置自启之前,应先手动验证程序能否正常运行:
/data/tool/jdk-21.0.5+11/bin/java \-Xms512m -Xmx1024m -Dfile.encoding=UTF-8 \-jar /data/cloud/nbsaas-mall2-front.jar \--spring.profiles.active=prod
若能正常启动并访问接口,则说明环境正确,接下来即可配置自动启动。
四、创建 systemd 服务
1. 新建服务文件
执行命令:
sudo vim /etc/systemd/system/nbsaas-mall2-front.service
写入以下内容:
[Unit]
Description=Nbsaas Mall2 Front Spring Boot Service
After=network.target[Service]
User=root
WorkingDirectory=/data/cloud
ExecStart=/data/tool/jdk-21.0.5+11/bin/java \-Xms512m -Xmx1024m -Dfile.encoding=UTF-8 \-jar /data/cloud/nbsaas-mall2-front.jar \--spring.profiles.active=prod
SuccessExitStatus=143
Restart=always
RestartSec=5
StandardOutput=append:/data/cloud/logs/nbsaas-mall2-front.out
StandardError=append:/data/cloud/logs/nbsaas-mall2-front.err
Environment=JAVA_HOME=/data/tool/jdk-21.0.5+11
Environment=PATH=/data/tool/jdk-21.0.5+11/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin[Install]
WantedBy=multi-user.target
说明:
-
WorkingDirectory指定工作目录; -
Restart=always保证程序异常退出后自动重启; -
StandardOutput与StandardError分别保存标准输出与错误日志; -
Environment明确指定 Java 环境路径,避免开机后环境变量丢失。
2. 启用并启动服务
执行以下命令:
sudo mkdir -p /data/cloud/logs
sudo chmod 755 /data/cloud
sudo systemctl daemon-reload
sudo systemctl enable nbsaas-mall2-front.service
sudo systemctl start nbsaas-mall2-front.service
sudo systemctl status nbsaas-mall2-front.service
如果输出中显示 Active: active (running),说明服务已成功启动并在后台运行。
五、常用管理命令
| 操作 | 命令 |
|---|---|
| 启动服务 | systemctl start nbsaas-mall2-front |
| 停止服务 | systemctl stop nbsaas-mall2-front |
| 重启服务 | systemctl restart nbsaas-mall2-front |
| 查看状态 | systemctl status nbsaas-mall2-front |
| 查看日志 | journalctl -u nbsaas-mall2-front -f |
提示:-f 参数可实时追踪日志输出。
六、可选增强配置
1. 独立环境变量文件
将应用运行所需环境变量写入外部文件:
sudo vim /etc/sysconfig/nbsaas-mall2-front
内容示例:
SPRING_PROFILES_ACTIVE=prod
JAVA_HOME=/data/tool/jdk-21.0.5+11
PATH=$JAVA_HOME/bin:$PATH
修改服务文件添加:
EnvironmentFile=-/etc/sysconfig/nbsaas-mall2-front
这样无需修改主服务文件即可独立调整配置。
2. 指定配置文件路径
如果 Spring Boot 配置文件不在默认位置,可在启动参数中指定:
--spring.config.location=/data/cloud/config/application-prod.yml
七、验证开机自动启动
重启服务器:
sudo reboot
系统重启后,验证服务是否自动运行:
systemctl status nbsaas-mall2-front
如状态为 active (running),则说明自动启动配置成功。
八、常见问题排查
| 问题 | 原因 | 解决方法 |
|---|---|---|
| “Failed to determine a suitable driver class” | 数据源配置文件未加载 | 在服务中显式声明 --spring.profiles.active 或 --spring.config.location |
| 日志未生成 | 日志目录权限不足 | 确保 /data/cloud/logs 拥有可写权限 |
| 启动后端口未监听 | 启动 profile 错误 | 检查环境变量是否正确加载 |
| systemd 报错 “ExecStart=/usr/bin/java: not found” | Java 路径未设置 | 使用 Environment=JAVA_HOME=... 明确路径 |
九、结语
通过使用 systemd 服务管理,Spring Boot 程序能够:
-
随系统自动启动;
-
崩溃后自动重启;
-
独立日志输出;
-
可统一管理、可远程控制。
相比传统的 nohup java -jar & 方式,systemd 更加稳定、安全、可维护,是生产环境中推荐的运行方式。
