部署springboot项目的shell脚本

以前部署项目都是通过ps -ef | grep java查找项目的进程号。找到进程号之后通过指令(kill -9 进程号)杀死进程。最后通过(nohup java -jar rex-api-0.0.1-SNAPSHOT.jar >out.log 2>&1 &)指令启动项目。这种方式手动查找进程号再kill掉,再重启项目这样太耗时间了。
今天看到一个shell脚本感觉挺好用的就记录一下


#!/bin/sh

APP_NAME=rex-api

tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
    echo 'Stop Process...'
    kill -15 $tpid
fi
sleep 2
tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
    echo 'kill -9 Process...'
    kill -9 $tpid
else
    echo 'Stop kill -15 Success!'
fi

nohup java -Xms6000M -Xmx6000M -Xmn2125M  -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/springboot/rex-api/OutOfMemory.dump -jar rex-api-0.0.1-SNAPSHOT.jar >out.log 2>&1 &

echo 'Restart Success!'

指令ps -ef | grep rex-api输出结果如下
在这里插入图片描述
Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入

awk指令的用法
[root@localhost awk]# echo “aa bb cc dd ee ff” | awk ‘{print $1}’
aa

kill -15 pid
大部分程序执行kill -15 pid指令后,会先释放自己的资源,然后再停止。但是也有程序可以在接受到信号量后,做一些其他的事情,并且这些事情是可以

配置的。如果程序正在等待IO,可能就不会立马做出相应。也就是说执行kill -15 pid指令后多半是会被阻塞的、忽略的。

kill -9 pid
多半程序执行后会终止进程,少数进程无法立即响应

APP_NAME是shell的变量,他的值是项目打包成jar后的名字的前面部分。tpid也是shell变量,最终赋值为项目进程的pid。指令ps -ef|grep $APP_NAME会获取到两个进程信息,一个是rex-api项目的进程信息另一个是grep指令的进程信息。指令grep -v grep是在上一指令的结果集中过滤掉grep指令进程信息。所以到这一步只有项目的进程信息了。指令grep -v kill是在上一次结果的进程信息中获取非kill指令进程的进程信息。这条指令其实可以不要的,只是严谨点。指令awk '{print $2}'是把项目进程信息的以文本的形式并且获取第二列文本的信息,其实获取的就是项目的进程pid。最终获取到的项目进程pid赋值给tpid变量

if [ ${tpid} ]; then 这行判断tpid变量是否有值,有值则执行 if 里面的命令终止进程。后面的指令都是一样的就不再描述了

你可能感兴趣的:(java,web,linux,shell,java)