行业资讯 2025年08月6日
0 收藏 0 点赞 817 浏览 2196 个字
摘要 :

文章目录 一、前言 二、脚本内容 三、使用方式 四、注意事项 五、开启远程debug 本文主要讲解关于shell脚本如何实现启动、停止、重启SpringBoot jar包相关内容,让我们……




  • 一、前言
  • 二、脚本内容
  • 三、使用方式
  • 四、注意事项
  • 五、开启远程debug

本文主要讲解关于shell脚本如何实现启动停止重启SpringBoot jar包相关内容,让我们来一起学习下吧!

一、前言

在我们使用SpringBoot框架开发完一个项目后,需要将该项目打成jar包,放到用于生产的服务器上去运行。

一般都是执行 java -jar xxx.jar &命令运行,但是这样是有问题的。
比如启动时需要加入参数,如-Dxxx=xxx,这个命令就会很长不易读且容易忘。所以,最好
是使用shell脚本将配置与命令维护起来。

二、脚本内容

start.sh

#!/bin/bash
#这里可替换为你自己的执行程序,其他代码无需更改
APP_NAME=xxx.jar

#使用说明,用来提示输入参数
usage() {
    echo \"Usage: sh 脚本名.sh [start|stop|restart|status]\"
    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 /home/admin/$APP_NAME > /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

三、使用方式

  • 给start.sh文件授权:chmod 744 start.sh
  • 启动服务,在当前目录下执行:./start.sh start
  • 关闭服务,在当前目录下执行:./start.sh stop
  • 重启服务,在当前目录下执行:./start.sh restart
  • 查看服务状态,在当前目录下执行:./start.sh status

四、注意事项

上面那个脚本的核心语句是:

nohup java -jar /home/admin/$APP_NAME > /dev/null 2>&1 &

可能有同学不知道第一个箭头后面的 /dev/null是什么意思,其实这里隐藏了一个大坑

网上很多脚本,也是类似的逻辑,但他们一般都会把/dev/null换成一个指定的文件路径,所有的日志都会输入到这个文件中。我们去使用的时候发现也没啥问题,还觉得这样挺好的,其实不然,这里的“没问题”只是现在没问题,一般倒霉都在几个月后。

使用有问题脚本的同学,会在几个月后收到服务器宕机的消息,登上服务器排查问题的时候会发现整个服务器都有问题了,轻则命令失效,重则无法连接。最后查到原因:
整个服务器的存储都满了,占满服务器存储的是我们服务的日志文件,上面那个日志文件几十个G,删掉这个文件就好了。

/dev/null通常被用于丢弃不需要的输出流。这里的日志都是SpringBoot的日常日志,
正常都是用logback或者log4j配置好了,根本不需要再使用nohup输出一次,所以nohup输出的日志直接丢弃就行了。

这些都是我自己血与泪的教训(πーπ),警示自己、警示后人。

五、开启远程debug

如果将

nohup java -jar /home/admin/$APP_NAME > /dev/null 2>&1 &

改成

nohup java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar /home/admin/xxxx/$APP_NAME > /dev/null 2>&1 &

也就是在java命令后面加上
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

那么就可以开启远程debug模式。这里顺便说一下Java远程debug怎么开,我用的开发工具是idea,如下步骤图示:shell脚本启动、停止、重启SpringBoot jar包

在host、port处输入远程服务IP地址和端口,点击运行即可开启远程debug。
特别注意:当远程debug结束后一定要记得删除该指令,这个属于一个后门,打开后别人也可以连接了。

以上就是关于shell脚本如何实现启动、停止、重启SpringBoot jar包相关的全部内容,希望对你有帮助。欢迎持续关注潘子夜个人博客,学习愉快哦!

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/10120.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号