在我们使用SpringBoot框架开发完一个项目后,需要将该项目打成jar包,放到用于生产的服务器上去运行。一般都是执行 java -jar xxx.jar &命令运行,但是这样是有问题的。
比如启动时需要加入参数,如-Dxxx=xxx,这个命令就会很长不易读且容易忘。所以,最好
是使用shell脚本将配置与命令维护起来。

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输出的日志直接丢弃就行了。

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

——————————————————————————分割线——————————————————————————
最近又学到一个,如果将

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正式版,如下步骤图示:
在host、port处输入远程服务IP地址和端口,点击运行即可开启远程debug。
特别注意:当远程debug结束后一定要记得删除该指令,这个属于一个后门,打开后别人也可以连接了。
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐