有时候我们需要将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
命令可以看到服务的状态。