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

news/2024/7/24 1:43:16 标签: linux, spring boot, jar, devops, 运维

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

目录结构

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

/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,如果改包名,直接改这个文件即可

#!/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是日志文件名

#!/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

#!/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

#!/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

#!/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

赋权

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

chmod a+x /data/*.sh

创建一个Service

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

vim /etc/systemd/system/myService.service

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

[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命令可以看到服务的状态。


http://www.niftyadmin.cn/n/5122897.html

相关文章

1221. 四平方和--(暴力,二分)

题目&#xff1a; 1221. 四平方和 - AcWing题库 思路1&#xff1a;暴力 暴力枚举 1.枚举顺序为从a到c&#xff0c;依次增大。 2.tn-a*a-b*b-c*c&#xff0c;求得dsqrt(t) 3.判断求出的d是否成立。d要求&#xff1a;d*dt&&d>c #include<iostream> #include&…

android button 按钮,设置左/右小图标,与文字居中距离

参考博客地址 功能点 支持自定义图标与文字的距离支持小图标宽高自定义支持左右自定义小图标 maven { url https://jitpack.io } implementation com.github.CMzhizhe:AppCompatButtonProject:1.0.0<com.gxx.buttonlibrary.DrawableCenterButtonandroid:layout_marginTop&…

VLAN实现二层流量隔离(mux-vlan)应用基础配置

MUX VLAN能够提供VLAN内的二层流量隔离机制。 MUX VLAN的类型如下所示 主VLAN: 加入主VLAN的接口可以和MUX VLAN内的所有接口进行通信 从VLAN: (1)隔离型从VLAN: 同一VLAN内接口之间不能互相通信&#xff0c;可以与主VLAN接口通信&#xff0c;不同从VLAN之间不能互相通信。 …

RCE 远程代码执行漏洞分析

RCE 漏洞 1.漏洞描述 Remote Command/Code Execute 远程命令执行/远程代码执行漏洞 这种漏洞通常出现在应用程序或操作系统中&#xff0c;攻击者可以通过利用漏洞注入恶意代码&#xff0c;并在受攻击的系统上执行任意命令。 2.漏洞场景 PHP 代码执行PHP 代码注入OS 命令执…

Ps:套索工具

Ps 的套索工具有三种&#xff0c;主要通过手动绘制的方式创建选区。 套索工具 Lasso Tool 又称“自由套索工具”&#xff0c;可绘制任意形状的选区&#xff0c;灵活快速但不够精确&#xff0c;是仅需粗略选区时&#xff08;比如&#xff0c;生成式填充等&#xff09;最常用的工…

【Python机器学习】零基础掌握IsolationForest集成学习

如何有效地识别异常数据点? 在日常工作和生活中,经常会遇到需要从大量数据中找出异常或者“不一样”的数据点的情况。比如在金融领域,怎样从数以百万计的交易记录中准确地找出可疑的欺诈交易?又或者在电商平台,如何从海量的商品评论中找出那些刷好评或刷差评的异常数据?…

造车先做三蹦子-之三:自制数据集(6x6数据集)230103

6*6的数据集制造、与识别: #6*6的数据集的制作、与识别、测试、输出等import torch import torch.nn as nn import torch.optim as optim# 定义模型 class NeuralNet(nn.Module):def __init__(self, input_size, hidden_size, num_classes):super(NeuralNet, self).__init__(…

深入理解Spring Boot AOP:CGLIB代理与JDK动态代理的完全指南

深入理解Spring Boot AOP&#xff1a;CGLIB代理与JDK动态代理的完全指南 前言第一&#xff1a;AOP和代理模式AOP&#xff08;面向切面编程&#xff09;&#xff1a;代理模式&#xff1a; 第二&#xff1a;深入分析CGLIB代理&#xff0c;包括其实现原理和内部机制CGLIB的实现原理…