一、文档说明

本文档为通用 Java / SpringBoot 应用部署方案,基于 systemd 进行服务托管。

  • 服务异常自动重启

  • 启动脚本自动加载系统环境


二、通用启动脚本 start.sh

#!/bin/bash
source /etc/profile
#jar包文件路径及名称(目录按照各自配置)
APP_NAME=xxx-application.jar
#日志文件路径及名称(目录按照各自配置)
LOG_FILE=logs/system.log
#查询进程,并杀掉当前jar/java程序
pid=`ps -ef|grep $APP_NAME | grep -v grep | awk '{print $2}'`
if [ -n "$pid" ]; then
    kill -9 $pid
    echo "$pid 进程终止成功"
else
    echo "没有运行中的进程,跳过杀死"
fi
sleep 2
#判断jar包文件是否存在,如果存在启动jar包,并时时查看启动日志
if test -e $APP_NAME
then
echo '文件存在,开始启动此程序...'
# 启动jar包,指向日志文件,2>&1 & 表示打开或指向同一个日志文件
exec java -jar $APP_NAME > $LOG_FILE 2>&1 
#实时查看启动日志(此处正在想办法启动成功后退出)
#tail -f $LOG_FILE
#输出启动成功(上面的查看日志没有退出,所以执行不了,可以去掉)
#echo '$APP_NAME 启动成功...'
else
echo '$APP_NAME 文件不存在,请检查。'
fi

三、通用 systemd 服务配置

文件路径:/etc/systemd/system/java-service.service

# ====================== 服务单元描述 ======================
[Unit]
# 服务描述信息
Description=General Java Application Service
# 服务依赖:等待网络启动完成后再启动
After=network.target
​
# ====================== 服务执行配置 ======================
[Service]
# 服务类型:简单进程模式
Type=simple
# 服务工作目录
WorkingDirectory=/data/service
# 服务启动命令(执行启动脚本)
ExecStart=/bin/bash /data/service/start.sh
# 服务停止命令(强制杀死 JAR 进程)
ExecStop=pkill -f xxx-application.jar
​
# ====================== 重启策略(生产级) ======================
# 服务异常退出时,always=总是自动重启
Restart=always
# 服务退出后,等待 10 秒再进行重启
RestartSec=10
# 启动次数限制统计时间窗口:300 秒(5 分钟)
StartLimitInterval=300
# 5 分钟内,最多允许重启 20 次
StartLimitBurst=20
# 达到限制后临时阻止重启,窗口过后自动恢复
StartLimitAction=none
​
# ====================== 日志配置 ======================
# 标准输出交给系统日志管理
StandardOutput=journal
# 错误输出交给系统日志管理
StandardError=journal
​
# ====================== 开机自启 ======================
[Install]
# 多用户环境下开机自启
WantedBy=multi-user.target

四、服务管理命令

# 重新加载 systemd 配置文件
# 修改 .service 文件后,必须执行该命令才能生效
systemctl daemon-reload
​
# 启动 Java 服务
systemctl start java-service
​
# 停止 Java 服务
systemctl stop java-service
​
# 重启 Java 服务(先停止再启动)
systemctl restart java-service
​
# 查看服务当前状态(运行中/已停止/失败等)
systemctl status java-service
​
# 设置服务开机自启(服务器重启后自动运行)
systemctl enable java-service
​
# 关闭服务开机自启
systemctl disable java-service
​
# 重置服务失败状态(解除“启动次数超限”锁定,恢复启动能力)
systemctl reset-failed java-service
​
# 实时查看服务日志(持续刷新,用于排查启动/运行问题)
journalctl -fu java-service

五、服务状态说明

  • starting:启动中

  • running:运行正常

  • failed:启动失败或重启次数超限

  • 异常退出后 10 秒自动重启

  • 5 分钟内最多重启 20 次,之后停止服务



附录:demo 项目部署实例

1. 目录结构

/data/demo
├── demo-1.0.0-SNAPSHOT.jar
├── start.sh
└── logs/

2. 网关启动脚本 start.sh

#!/bin/bash
source /etc/profile
#jar包文件路径及名称(目录按照各自配置)
APP_NAME=demo-1.0.0-SNAPSHOT.jar
#日志文件路径及名称(目录按照各自配置)
LOG_FILE=logs/system.log
#查询进程,并杀掉当前jar/java程序
pid=`ps -ef|grep $APP_NAME | grep -v grep | awk '{print $2}'`
if [ -n "$pid" ]; then
    kill -9 $pid
    echo "$pid 进程终止成功"
else
    echo "没有运行中的进程,跳过杀死"
fi
sleep 2
#判断jar包文件是否存在,如果存在启动jar包,并时时查看启动日志
if test -e $APP_NAME
then
echo '文件存在,开始启动此程序...'
# 启动jar包,指向日志文件,2>&1 & 表示打开或指向同一个日志文件
exec  java  -Dspring.profiles.active=dev   -jar $APP_NAME > $LOG_FILE 2>&1 
#实时查看启动日志(此处正在想办法启动成功后退出)
#tail -f $LOG_FILE
#输出启动成功(上面的查看日志没有退出,所以执行不了,可以去掉)
#echo '$APP_NAME 启动成功...'
else
echo '$APP_NAME 文件不存在,请检查。'
fi

3. 网关 systemd 配置

文件路径:/etc/systemd/system/java-demo.service

[Unit]
Description=java-demo
After=network.target
​
[Service]
Type=simple
WorkingDirectory=/data/demo
ExecStart=/bin/bash /data/demo/start.sh
ExecStop=pkill -f 'demo-1.0.0-SNAPSHOT.jar'
​
Restart=always
RestartSec=10
StartLimitInterval=300
StartLimitBurst=20
StartLimitAction=none
​
StandardOutput=journal
StandardError=journal
​
[Install]
WantedBy=multi-user.target

4. 完整部署步骤

# 创建目录
mkdir -p /data/demo/logs
​
# 赋予脚本执行权限
chmod +x /data/demo/start.sh
​
# 配置环境变量
vi /etc/profile
source /etc/profile
​
# 配置服务
vi /etc/systemd/system/java-demo.service
​
# 加载并启动
systemctl daemon-reload
systemctl start java-demo
systemctl enable java-demo

5. 网关服务管理命令

systemctl status java-demo
systemctl restart java-demo
systemctl stop java-demo
systemctl reset-failed java-demo
journalctl -fu java-demo
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐