Java 应用 Systemd 部署文档
·
一、文档说明
本文档为通用 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
更多推荐





所有评论(0)