在实际部署 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 部署方式纳入标准交付规范。