Linux服务器shell脚本启动、停止、重启SpringBoot jar包
shell脚本如下,使用者创建一个文件,取名为使用方式说明或注意上面那个脚本的核心语句是:可能有同学不知道第一个箭头后面的 是什么意思,其实这里隐藏了一个大坑。网上很多脚本,也是类似的逻辑,但他们一般都会把换成一个,所有的日志都会输入到这个文件中。我们去使用的时候发现也没啥问题,还觉得这样挺好的,其实不然,这里的“没问题”只是现在没问题,一般倒霉都在几个月后。使用有问题脚本的同学,会在几个月后收到
在我们使用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结束后一定要记得删除该指令,这个属于一个后门,打开后别人也可以连接了。
文末小彩蛋,自建摸鱼网站,各大网站热搜一览,上班和摸鱼很配哦!
更多推荐
所有评论(0)