如何在Linux将Spring Boot项目的Jar包注册为开机自启动系统服务

有时候我们需要将Spring Boot打包出来jar文件当做系统服务注册到系统中,本文教你如何操作

目录结构

以下是目录结构,jar文件是从maven package打包出来的,config/application.yml是原先在项目的resources文件夹里,外置出来方便适配开发环境和正式环境。static目录用来存放静态资源,比如vue前端或者上传目录。所有的.sh文件都是本文后续要写的。

js 复制代码
/data
	/start.sh 						   // 启动脚本
	/stop.sh						   // 关闭脚本
	/serviceStart.sh				   // 服务启动脚本
	/serviceStop.sh 				   // 服务关闭脚本
	/YumeisoftDemo-0.0.1-SNAPSHOT.jar  // 打包的项目Jar包
	/config							   // 配置文件目录
		/application.yml			   // 项目配置文件
	/jdk							   // jdk目录
	/static							   // 静态资源目录

编写Service调用的脚本

配置脚本/data/config.sh,如果改包名,直接改这个文件即可

bash 复制代码
#!/bin/sh
# 配置JAR文件名,把它改成你的Jar文件名
SPRING_JARFILE=YumeisoftDemo-0.0.1-SNAPSHOT.jar
# 日志文件位置
LOG_FILE=system.log
# 获取.sh所在路径
INSTALL_DIR=$(cd $(dirname $0);pwd)
# 配置JDK路径
JAVA_HOME=$INSTALL_DIR/jdk
# 设定PATH,不设会无法使用java命令
PATH=$JAVA_HOME/bin:$PATH

手动启动服务脚本/data/start.sh,其中system.log是日志文件名

bash 复制代码
#!/bin/sh
# 读取config.sh定义的内容
source $INSTALL_DIR/config.sh
# 后台方式运行jar包
nohup java -jar $INSTALL_DIR/$SPRING_JARFILE > $INSTALL_DIR/$LOG_FILE 2>&1 &
# 显示日志
tail -f $INSTALL_DIR/$LOG_FILE

手动关闭服务脚本/data/stop.sh

bash 复制代码
#!/bin/sh
# 读取config.sh定义的内容
source $INSTALL_DIR/config.sh
# 获取当前项目运行的进程ID
PID=$(ps -ef | grep "java -jar $INSTALL_DIR/$SPRING_JARFILE" | grep -v grep | awk '{print $2}')

if [ -z "$PID" ]; then
	# 如果没找到则提示未运行
    echo "Spring Boot应用未在运行中."
else
	# 如果找到了,正常终止进程
    kill $PID
    # 显示日志
    tail -f $INSTALL_DIR/$LOG_FILE
    echo "Spring Boot应用已停止."
fi

服务启动脚本/data/serviceStart.sh

bash 复制代码
#!/bin/sh
# 读取config.sh定义的内容
source $INSTALL_DIR/config.sh
# 后台方式运行jar包
nohup java -jar $INSTALL_DIR/$SPRING_JARFILE > $INSTALL_DIR/$LOG_FILE 2>&1 &

服务关闭脚本/data/serviceStop.sh

bash 复制代码
#!/bin/sh
# 读取config.sh定义的内容
source $INSTALL_DIR/config.sh
# 获取当前项目运行的进程ID
PID=$(ps -ef | grep "java -jar $INSTALL_DIR/$SPRING_JARFILE" | grep -v grep | awk '{print $2}')

if [ -z "$PID" ]; then
	# 如果没找到则提示未运行
    echo "Spring Boot应用未在运行中."
else
	# 如果找到了,正常终止进程
    kill $PID
    echo "Spring Boot应用已停止."
fi

赋权

不赋权是无法运行的,所以我们要执行以下命令:

shell 复制代码
chmod a+x /data/*.sh

创建一个Service

接下来我们把这个项目注册为系统服务,myService改成你要改成的服务名:

bash 复制代码
vim /etc/systemd/system/myService.service

因为之前没有这个系统服务,会创建一个新文件,这个文件就是系统服务的启停配置文件,按一下a进入编辑模式,把下面的代码粘贴上去,然后按下Esc、冒号、输入wq、回车。

shell 复制代码
[Unit]
Description=MyService
After=network.target

[Service]
Type=forking
ExecStart=/data/serviceStart.sh
ExecStop=/data/serviceStop.sh
PrivateTmp=true

[Install]
WantedBy=multi-user.target

这里面的ExecStart和ExecStop都是服务启动和服务停止脚本的绝对路径。Description是指服务的描述信息,这里可以填中文,其他的不要改动。

启用并使用Service

做完以上步骤你就可以在服务器里执行systemctl enable myService命令,即可启用myService服务,然后使用systemctl start myService即可启动服务,systemctl stop myService即可关停服务,system status myService命令可以看到服务的状态。

相关推荐
Flittly19 小时前
【AgentScope Java新手村系列】(14)人机交互
java·spring boot·spring
Flynt2 天前
从Spring Boot 4.0升到4.1,我在Maven和gRPC上栽了跟头
java·spring boot·后端
AlfredZhao2 天前
生产环境里,为什么不建议把普通端口直接暴露到公网?
linux·https·443·80
Gnix102973 天前
Copier 总报错?一篇讲透排查、升级、治理和团队落地
devops
掉鱼的猫3 天前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
java·spring boot
戴为沐3 天前
Linux内存扩容指南
linux
zylyehuo3 天前
Linux 彻底且安全地删除文件
linux
人活一口气3 天前
Spring Boot与AIGC的完美结合:从零搭建智能内容生成平台
java·spring boot·aigc
用户805533698034 天前
主线 U-Boot 上 RK3506:和闭源 rkbin 拔河的三个隐性契约
linux·嵌入式
用户034095297914 天前
linux fcitx 5 雾凇拼音 设置在中文输入法下仍然输入英文标点
linux