当前位置: 首页 > news >正文

在 Linux 系统中实现 Spring Boot 程序自动启动的最佳实践

在实际部署 Spring Boot 项目的生产环境中,如何确保服务自动启动(如开机自动运行、宕机自动恢复)是一项基础而关键的运维能力。本文将系统介绍如何在 Linux 中将 Spring Boot 应用注册为 systemd 服务,实现进程守护与自动启动。


📌 为什么使用 systemd 管理 Spring Boot

相比传统的 nohup 启动方式,使用 systemd 有以下优势:

  • 自动启动:系统启动时自动拉起服务

  • 异常重启:服务异常退出后可自动重启

  • 统一日志管理:支持标准输出日志与 GC 日志分离

  • 安全资源限制:可定义 CPU、内存、文件数限制

  • 进程守护:无需人工写监控脚本


🧱 一、准备工作

1. 创建应用部署目录结构(推荐)

/opt/nbsaas/
├── db/
│   ├── nbsaas-baison-db.jar
│   ├── start.sh
│   └── logs/

2. 编写启动脚本 start.sh

#!/bin/bashAPP_NAME="nbsaas-baison-db.jar"
JAR_PATH="/opt/nbsaas/db/$APP_NAME"
LOG_DIR="/opt/nbsaas/db/logs"mkdir -p $LOG_DIRJAVA_OPTS=""
JAVA_OPTS+=" -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
JAVA_OPTS+=" -XX:+UseStringDeduplication"
JAVA_OPTS+=" -XX:+UseContainerSupport -XX:MaxRAMPercentage=50"
JAVA_OPTS+=" -Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai"
JAVA_OPTS+=" -Xlog:gc*:file=${LOG_DIR}/gc.log:time,level,tags"exec java $JAVA_OPTS -jar $JAR_PATH

⚠️ 使用 exec 而非 nohup,确保 systemd 能正确追踪进程 PID。


⚙️ 二、创建 systemd 服务文件

/etc/systemd/system/nbsaas-db.service 中创建如下内容:

[Unit]
Description=Nbsaas DB Service
After=network.target[Service]
Type=simple
User=root
WorkingDirectory=/opt/nbsaas/db
ExecStart=/opt/nbsaas/db/start.sh
ExecStop=/bin/kill -TERM $MAINPID
Restart=on-failure
RestartSec=5s
StandardOutput=append:/opt/nbsaas/db/logs/stdout.log
StandardError=append:/opt/nbsaas/db/logs/stderr.log[Install]
WantedBy=multi-user.target

说明:

字段含义
WorkingDirectory程序启动目录
ExecStart启动命令(调用你自定义的脚本)
Restart=on-failure非 0 退出时自动重启
WantedBy=multi-user.target多用户模式下自动启动

🚀 三、启动服务并设置开机启动

# 重新加载 systemd 配置
sudo systemctl daemon-reload# 启动服务
sudo systemctl start nbsaas-db.service# 查看状态
sudo systemctl status nbsaas-db.service# 设置开机自启动
sudo systemctl enable nbsaas-db.service

🔍 四、常见运维命令

# 查看日志
journalctl -u nbsaas-db.service -f# 停止服务
sudo systemctl stop nbsaas-db.service# 重启服务
sudo systemctl restart nbsaas-db.service# 禁止开机启动
sudo systemctl disable nbsaas-db.service

🧠 五、实用优化建议

项目建议
多服务部署为每个服务单独创建一个 service 文件
异常退出日志可通过 stderr.log + journalctl 排查
内存控制使用 -XX:MaxRAMPercentage=50 控制内存
安全用户隔离推荐使用非 root 用户运行(可修改 User=xxx
服务依赖可配置 After=mysql.service 等依赖

✅ 六、自动重启脚本和部署流程推荐

将多个服务统一写成 systemd 服务,每个服务独立部署目录、独立日志,便于问题快速排查与水平扩展。

建议结合 DevOps 工具链(如 Jenkins、Ansible)自动部署服务与注册 systemd 文件。


✍️ 结语

通过将 Spring Boot 程序以 systemd 服务方式部署在 Linux 上,不仅提升了应用的稳定性和运维效率,也为后续自动化部署、弹性伸缩打下了坚实基础。作为软件架构师或运维工程师,应当将 systemd 部署方式纳入标准交付规范。

http://www.dtcms.com/a/282707.html

相关文章:

  • STM32 GPIO
  • 【深度学习】神经网络-part2
  • 架构设计之计算高性能——单体服务器高性能
  • 算法训练营DAY34 第九章 动态规划part02
  • 告别定位盲区!低成本组合导航系统ER-GNSS/MINS-05的实战能力
  • 不安全的 SSL:主机名验证功能被禁用与修复方案
  • WP Force SSL Pro – HTTPS SSL Redirect Boost Your Website‘s Trust in Minutes!
  • 使用token调用Spring OAuth2 Resource Server接口错误 insufficient_scope
  • 服务攻防-Java组件安全数据处理FastJsonJackSonXStream自动BP插件CVE漏洞
  • 多级缓存架构与热点探测系统核心技术解析
  • 2025年C++后端开发高频面试题深度解析:线程安全LRU缓存设计与实现
  • 免费MCP服务:Excel CSV 转 JSON MCP by WTSolutions 文档
  • C++:现代 C++ 编程基石,C++11核心特性解析与实践
  • 软件开发:重塑商贸物流行业格局的核心力量
  • Zabbix监控K8S的PV信息详细教程!
  • AI产品经理面试宝典第25天:AI+机器人产品设计与技术落地面试题与答法
  • Xsens人形机器人拟人动作AI训练,提升机器人工作精度与效率
  • MySQL高并发高可用架构:分库分表实战与ShardingSphere中间件应用
  • JavaScript语言 Error对象及错误处理机制 原生错误类型
  • 芯谷科技--FET偏置控制器,为卫星通信系统提供稳定偏置D8400
  • 大模型智能体(Agent)工程化:AutoGen企业级落地方案全解析
  • exports使用 package.json字段控制如何访问你的 npm 包
  • A13 GMS应用预装
  • 微服务引擎 MSE 及云原生 API 网关 2025 年 5 月产品动态
  • Git 提交信息(Commit Message)的规范校验,husky + commitlint
  • Java全栈工程师面试实录:从电商场景到AIGC的深度技术挑战
  • 手动搭建PHP环境:步步为营,解锁Web开发
  • 【尝试】基于openai-whisper进行语音转文字windows版本
  • 【项目实践】SMBMS(Javaweb版)汇总版
  • flink sql如何对hive string类型的时间戳进行排序