Linux使用一个脚本启用、停用springboot项目(本文带脚本)

news2025/1/12 23:16:12

前言

如果仅需要脚本的小伙伴可以下拉至后面,我这里一步一步交大家发布项目

学习之前我们要先会搭建一个项目

可以去看这篇文章:搭建一个SpringBoot项目

一、首先我们配置多环境

0、resources文件如下

在这里插入图片描述

1、配置pom.xml文件

    <build>
        <!--打包后的文件名-->
        <finalName>popularize</finalName>
        <!--需要开启 resource 过滤,才能进行占位符使用 @profiles.active@-->
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                    <include>**/*.yaml</include>
                    <include>**/*.yml</include>
                </includes>
                <!-- 启用过滤 -->
                <filtering>true</filtering>
            </resource>
        </resources>
        <plugins>
            <!--打包工具-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <profiles>
        <!--开发环境-->
        <profile>
            <id>sit</id>
            <properties>
                <profiles.active>sit</profiles.active>
            </properties>
            <!-- 设置为默认环境 -->
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <!--生产环境-->
        <profile>
            <id>prd</id>
            <properties>
                <profiles.active>prd</profiles.active>
            </properties>
        </profile>
    </profiles>

2、配置application.yaml文件(对应pom.xml中的不同环境)

spring:
  profiles:
    active: @profiles.active@

3、右键刷新

**在这里插入图片描述
**

4、idea(maven)打包

在这里插入图片描述

二、打包之后我们放到指定的Linux文件夹中

在这里插入图片描述

三、编写脚本

1、文件名随便取(我的就叫jar.sh)

#!/bin/bash
#这里可替换为你自己的执行程序,其他代码无需更改
#jar包的名字
APP_NAME=popularize.jar
#项目路径
PROJECT_PATH=/popularize
#项目环境,比如我的是开发环境是sit,生成环境是prd
ENV=prd
 
#使用说明,用来提示输入参数
usage() {
    echo "使用方法: ./脚本名.sh [start|stop|restart|status]"
    echo "使用方法: ./脚本名.sh start 是启动"
    echo "使用方法: ./脚本名.sh stop 是停止"
    echo "使用方法: ./脚本名.sh status 是查看输出运行状态"
    echo "使用方法: ./脚本名.sh restart 是重启"
    exit 1
}
 
#检查程序是否在运行
is_exist(){
  pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' `
  #如果不存在返回1,存在返回0
  if [ -z "${pid}" ]; then
   return 1
  else
    return 0
  fi
}
 
#启动方法
start(){
  is_exist
  if [ $? -eq "0" ]; then
    # echo "${APP_NAME} is already running. pid=${pid} ."
  else
    nohup java -jar $PROJECT_PATH/$APP_NAME –-spring.profiles.active=$ENV > /dev/null 2>&1 &
    echo "${APP_NAME} start success"
  fi
}
 
#停止方法
stop(){
  is_exist
  if [ $? -eq "0" ]; then
    kill -9 $pid
  else
    echo "${APP_NAME} is not running"
  fi
}
 
#输出运行状态
status(){
  is_exist
  if [ $? -eq "0" ]; then
    echo "${APP_NAME} is running. Pid is ${pid}"
  else
    echo "${APP_NAME} is NOT running."
  fi
}
 
#重启
restart(){
  stop
  start
}
 
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
  "start")
    start
    ;;
  "stop")
    stop
    ;;
  "status")
    status
    ;;
  "restart")
    restart
    ;;
  *)
    usage
    ;;
esac

2、随便放到哪个文件夹下面,在当前目录下授权文件

chmod 744 springjar.sh

3、使用

  • 启动服务,在当前目录下执行:./jar.sh start
  • 关闭服务,在当前目录下执行:./jar.sh stop
  • 重启服务,在当前目录下执行:./jar.sh restart
  • 查看服务状态,在当前目录下执行:./jar.sh status

四、讲解脚本

0、输入参数,就是 ./jar.sh 后面的参数,根据参数不同进入不同的方法

# 根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
  "start")
    start
    ;;
  "stop")
    stop
    ;;
  "status")
    status
    ;;
  "restart")
    restart
    ;;
  *)
    usage
    ;;
esac

1、usage 方法(使用说明)

如果在当前目录下执行:./jar.sh 后面不带参数,或者不是 start|stop|restart|status 的任意值

#使用说明,用来提示输入参数
usage() {
    echo "使用方法: ./脚本名.sh [start|stop|restart|status]"
    echo "使用方法: ./脚本名.sh start 是启动"
    echo "使用方法: ./脚本名.sh stop 是停止"
    echo "使用方法: ./脚本名.sh status 是查看输出运行状态"
    echo "使用方法: ./脚本名.sh restart 是重启"
    exit 1
}

会执行usage方法,在控制台打印,如下

使用方法: ./脚本名.sh [start|stop|restart|status]
使用方法: ./脚本名.sh start 是启动
使用方法: ./脚本名.sh stop 是停止
使用方法: ./脚本名.sh status 是查看输出运行状态
使用方法: ./脚本名.sh restart 是重启

2、is_exist 方法(检查程序是否在运行)

检查程序是否在运行,每个方法都会调用此方法

项目启动了,会把项目的进程号赋给pid变量,返回0,项目没启动pid为空,返回1

#检查程序是否在运行
is_exist(){
  pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' `
  #如果不存在返回1,存在返回0
  if [ -z "${pid}" ]; then
   return 1
  else
    return 0
  fi
}

3、start 方法(启动)

先查看is_exist方法返回是0吗,如果是就啥也不操作,如果不是0,则后台启动java项目

#启动方法
start(){
  is_exist
  if [ $? -eq "0" ]; then
    # echo "${APP_NAME} is already running. pid=${pid} ."
  else
    nohup java -jar $PROJECT_PATH/$APP_NAME –-spring.profiles.active=$ENV > /dev/null 2>&1 &
    echo "${APP_NAME} start success"
  fi
}
3.1、nohup java -jar $PROJECT_PATH/$APP_NAME –-spring.profiles.active=$ENV
nohup java -jar $PROJECT_PATH/$APP_NAME –-spring.profiles.active=$ENV 

根据文件最上面的项目地址、项目名和项目环境,后台(nohup)启动 jar包,并且环境配置为prd–-spring.profiles.active=$ENV ),

3.2、> /dev/null 2>&1
> /dev/null 2>&1 &

# 最基本后台启动的jar包启动可以这样启动,现在就是把 > log.log & 变成了 > /dev/null 2>&1 &
nohup java -jar xxx.jar > log.log &

最基础的启动,jar包会把日志加载到当前目录下的log.log文件中,而> /dev/null 2>&1就是说把正确或是错误的日志全扔掉,我们的项目中有logback.xml文件,他会自己把普通或错误的日志都输出到指定的文件中,我们不需要管

这里也就是将所有产生的日志都丢弃,因为我们项目中logback.xml已经指定了日志的格式和输出位置。

主要讲讲 > /dev/null 2>&1
通常情况下,总是有三个文件会被打开。它们各自对应的流:

0:标准输入流 stdin
1:标准输出流 stdout
2:标准错误流 stderr

>:将流输出到文件

同:1 >,默认情况下就是1,即标准输出,一般都省略。

/dev/null:这个文件是一个无底洞,无法打开,相当于是一个垃圾站。

也就是将所有产生的日志都丢弃,因为我们项目中logback.xml已经指定了日志的格式和输出位置。

2>&1:代表将标准错误2重定向到标准输出1

标准输出和标准错误都输出到/dev/null。如果是2>1的话,代表将标准错误输出到文件1,而不是重定向到标准输出流。

4、stop 方法(停止)

根据is_exist方法拿到项目的进程号后,结束掉就好了

#停止方法
stop(){
  is_exist
  if [ $? -eq "0" ]; then
    kill -9 $pid
  else
    echo "${APP_NAME} is not running"
  fi
}

5、status 方法(输出运行状态)

根据is_exist方法,看是否存在,存在输出 ”项目名 is running. Pid is 进程号 “ ,不存在输出 “项目名 is NOT running.”

#输出运行状态
status(){
  is_exist
  if [ $? -eq "0" ]; then
    echo "${APP_NAME} is running. Pid is ${pid}"
  else
    echo "${APP_NAME} is NOT running."
  fi
}

6、restart 方法(重启)

就是先停止,后启用

#重启
restart(){
  stop
  start
}

参考

Linux shell脚本启动、停止SpringBoot的jar包_

参数“> /dev/null 2>1“的含义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1037064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp webview实现双向通信

需求&#xff1a;uniapp webview嵌套一个h5 实现双向通信 uniapp 代码 <template><view><web-view src"http://192.168.3.150:9003/" message"onMessage"></web-view></view> </template><script>export defau…

精品基于Python房源爬虫实现数据可视化分析

《[含文档PPT源码等]精品基于Python实现的爬虫实现数据可视化分析》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django 前端技术&#xff1a;JavaScript…

JavaScript中的解构赋值

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 对象解构赋值⭐ 数组解构赋值⭐ 默认值和剩余元素⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚…

【面试经典150 | 滑动窗口】长度最小的子数组

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;暴力枚举方法二&#xff1a;滑动窗口 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些…

stable diffusion模型评价框架

GhostReview:全球第一套AI绘画ckpt评测框架代码 - 知乎大家好&#xff0c;我是_GhostInShell_&#xff0c;是全球AI绘画模型网站Civitai的All Time Highest Rated (全球历史最高评价) 第二名的GhostMix的作者。在上一篇文章&#xff0c;我主要探讨自己关于ckpt的发展方向的观点…

如何模拟自然界生态系统中的食物链

本人最近在研究一款针对青少年儿童的教育游戏&#xff0c;希望从培养孩子各方面的综合素质出发&#xff0c;引导孩子掌握多方面的软知识&#xff0c;软技能。其中有一个比较新颖的游戏玩法------打猎。该玩法创新点在于&#xff0c;引入了食物链的概念。过去一般的游戏里&#…

【C++】STL之list深度剖析及模拟实现

目录 前言 一、list 的使用 1、构造函数 2、迭代器 3、增删查改 4、其他函数使用 二、list 的模拟实现 1、节点的创建 2、push_back 和 push_front 3、普通迭代器 4、const 迭代器 5、增删查改(insert、erase、pop_back、pop_front) 6、构造函数和析构函数 6.1、默认构造…

BGP-IBGP(第九课)

BGP-IBGP(第九课) 0 IBGP 水平分割的概念 1 BGP 反射器 2 IBGP 互联不了的原因 3 BGP 通告原则 4 IBGP 互通 方案一 静态路由 5 IBGP 互通 方案二 OSPF 中引入BGP 6 IBGP 互通 方案三 全网互通 7 IBGP 互通 方案四 反射器 0 IBGP 水平分割的概念 通过IBGP获得的最优路由不会发…

网页文本编辑器

<!DOCTYPE html> <html><head><meta charset"utf-8"><title>文本编辑器</title><style>.box {height: 500px;width: 1000px;margin: auto;background-color: navajowhite;}.box_h {/* font-weight: normal; */text-al…

基于springboot小区疫情防控系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

前端性能优化汇总

1.减少HTTP请求次数和请求的大小 &#xff08;三大类&#xff09; 文件的合并和压缩&#xff1a;&#xff08;1&#xff09;&#xff08;6&#xff09; 延迟加载&#xff1a;&#xff08;3&#xff09;&#xff08;4&#xff09; 用新的文件格式代替传统文件格式&#xff1a;&a…

百度SEO优化基本原理(掌握SEO基础,提高网站排名)

随着互联网的迅速发展&#xff0c;越来越多的企业开始意识到网站优化的重要性&#xff0c;其中百度SEO优化是企业不可忽视的一项工作。本文将介绍百度SEO优化的基本概念、步骤、原理、解决方法和提升网站标题优化的方法。蘑菇号-www.mooogu.cn 百度SEO优化是指针对百度搜索引擎…

[源码系列:手写spring] AOP第一节:切点表达式

在本专栏之前的文章中已经带大家熟悉了Spirng中核心概念IOC的原理以及手写了核心代码&#xff0c;接下来将继续介绍Spring中另一核心概念AOP。 AOP即切面编程是Spring框架中的一个关键概念&#xff0c;它允许开发者在应用程序中优雅地处理横切关注点&#xff0c;如日志…

c++程序内存区域划分

目录 内存区域划分 例题&#xff1a; malloc&#xff0c;calloc和realloc的区别 new和delete 申请空间并初始化 申请多个空间&#xff1a; new和delete对于自定义类型的处理&#xff1a; new和delete一定要匹配 new和malloc以及delete和free的区别 抛异常的使用方法&…

ubuntu 开启笔记本摄像头并修复画面颠倒问题

文章目录 基本环境状况&#xff1a; 没找到摄像头检查 opencv检查系统应用 键盘右侧&#xff0c;硬件层面开启摄像头画面镜像问题 基本环境 笔记本&#xff1a; 联想拯救者 系统&#xff1a; ubuntu 22.04 状况&#xff1a; 没找到摄像头 检查 opencv 使用 cv::VideoCaptu…

vue elemnt封装文件上传 +根据后台接口来上传文件

1.创建一个新的子页面,放文件上传 <template> <div><el-uploadaction"https://jsonplaceholder.typicode.com/posts/"list-type"picture-card":on-preview"handlePictureCardPreview":on-remove"handleRemove">&l…

7.网络原理之TCP_IP

文章目录 1.网络基础1.1认识IP地址1.2子网掩码1.3认识MAC地址1.4一跳一跳的网络数据传输1.5总结IP地址和MAC地址1.6网络设备及相关技术1.6.1集线器&#xff1a;转发所有端口1.6.2交换机&#xff1a;MAC地址转换表转发对应端口1.6.3主机&#xff1a;网络分层从上到下封装1.6.4主…

交换机技术综述(第十一课)

交换机技术综述基础 1 Vlan技术的学习 三大接口 Vlan技术实操(第四课)_IHOPEDREAM的博客-CSDN博客https://drean.blog.csdn.net/article/details/132455765?spm=1001.2014.3001.5502

论文阅读:DisCO Portrait Distortion Correction with Perspective-Aware 3D GANs

论文阅读&#xff1a;DisCO Portrait Distortion Correction with Perspective-Aware 3D GANs 今天介绍一篇比较有趣的文章&#xff0c;通过 3D GAN inversion 来解决成像的透视畸变问题 Abstract 文章的摘要&#xff0c;一开始就介绍说&#xff0c;近距离成像的时候&#x…

【3维视觉】20230922_网格编码最新进展

网格编码技术研究进展 1. VDMC编码技术 1.1 VDMC介绍 1.1.1 编码对象 具有时变拓扑的动态网格 1.1.2 技术细节 VDMC的编码和解码过程的高层框图如图2所示[4][5]。预处理模块提供了更好的率失真( Rate-Distortion&#xff0c;RD )性能&#xff0c;支持可伸缩解码和渐进传输…