Linux服务器shell脚本启动、停止、重启SpringBoot jar包

一、前言

大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

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

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

二、脚本内容

start.sh

bash 复制代码
#!/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

四、注意事项

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

shell 复制代码
nohup java -jar /home/admin/$APP_NAME > /dev/null 2>&1 &

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

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

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

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

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

五、开启远程debug

如果将

shell 复制代码
nohup java -jar /home/admin/\$APP\_NAME > /dev/null 2>&1 &

改成

shell 复制代码
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,如下步骤图示:

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

相关推荐
郭式云源生法则1 小时前
归档及压缩、重定向与管道操作和综合使用,find精确查找、find处理查找结果、vim高级使用、vimdiff多文件使用
linux·运维·服务器
一张假钞1 小时前
Ubuntu 24.04 安装 Jenkins
linux·ci/cd·jenkins
Kiri霧2 小时前
Rust开发环境搭建
开发语言·后端·rust
tuokuac2 小时前
查看你电脑上某个端口正在被哪个进程占用
linux
MANONGMN2 小时前
Linux 通配符与正则表达式(含实战案例+避坑指南)
linux·运维·正则表达式
带土12 小时前
18 .shell编程-正则表达式
linux·正则表达式
爱吃甜品的糯米团子3 小时前
Linux 学习笔记之进程管理、网络基础与常用软件安装
linux·网络·学习
Micro麦可乐3 小时前
Centos Stream 9 中Docker安装出现 download.docker.com:443 的问题解决
linux·docker·centos·podman
间彧3 小时前
Spring事件监听与消息队列(如Kafka)在实现解耦上有何异同?
后端
间彧3 小时前
Java如何自定义事件监听器,有什么应用场景
后端