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结束后一定要记得删除该指令,这个属于一个后门,打开后别人也可以连接了。

相关推荐
Warson_L12 小时前
LangGraph入门学习资料
后端
神奇小汤圆12 小时前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
后端
kfaino12 小时前
码农的AI翻身(四)你好,我叫 Attention
人工智能·后端
lwx5728012 小时前
探秘InnoDB:搞懂它的内存、线程、磁盘与日志刷盘策略
java·后端
云技纵横14 小时前
Spring Boot Actuator 被打穿:线上开了这些端点,等于裸奔
后端
Flynt14 小时前
从Spring Boot 4.0升到4.1,我在Maven和gRPC上栽了跟头
java·spring boot·后端
江华森15 小时前
Django 6.0 从入门到实战教程(上机实操版)
后端
ZhengEnCi16 小时前
J7A-高级Java工程师面试三道灵魂拷问-深度广度与工程素养的终极检验
java·后端
AlfredZhao16 小时前
生产环境里,为什么不建议把普通端口直接暴露到公网?
linux·https·443·80
爱勇宝17 小时前
小红花成长新版:模板来了,鼓励也更容易开始
前端·后端·程序员