由于在工作的时候,修改代码的过后,然后重新打包上传指定的jar文件,这个时候通过ps -aux | grep java
命令找到原来的运行的jar包,然后通过kill -9 线程Id
,最后再执行 java -jar jar包的名字
。每次修改过后打包上传都要执行这三条的命令,太过于繁琐。
于是我想出用docker来部署,但是docker也必须要重启容器,也过于麻烦。于是就想写个shell脚本来执行的我们的三条指令。
本人的项目中主要有三个jar,分别是law-biz-lawyer-1.0.jar
,law-biz-api-1.0.jar
,law-biz-mng-1.0.jar
,然后修改过后,每次要重新运行,shell中难点就是怎么获取到指定的线程Id?于是在网上查阅相关的资料,终于找到了如下的指令
# $1变量是自己shell运行后面跟的第一个参数
# grep -v grep 是在列出的进程中去除含有关键字 grep 的进程
# grep -v /bin/sh 是在列出的进程中去除含有关键字 /bin/sh 的进程 为了排除 shell运行的进程,因为在杀死原来的Java进程后还要执行启动的Java
# awk '{print $2}' 一行一行的读取指定的文件, 以空格作为分隔符,打印第二个字段
ps -ef|grep $1|grep -v grep|grep -v PPID|grep -v /bin/sh|awk '{print $2}'
既然能获取到线程的Id,那就能杀死这个指定的进程,然后再去指定的目录下执行启动jar。于是写出下面的shell文件
#!/bin/sh
#根据进程名杀死进程
if [ $# -lt 1 ]
then
echo "缺少参数: procedure_name"
exit 1
fi
# 根据输入的应用名,找出指定的应用的线程Id
PROCESS=`ps -ef|grep $1|grep -v grep|grep -v PPID|grep -v /bin/sh|awk '{print $2}'`
#echo "$PROCESS"
# 然后打印杀死的线程的Id
echo "Kill the $1 process [ ${PROCESS[0]} ]"
# 杀死指定的线程
kill -9 $PROCESS
echo "执行-----启动"
# 根据指定的应用名称启动指定的应用
if [ $1 = "law-biz-api-1.0.jar" ]
then
echo "启动api"
cd /root/apiservice/green
nohup java -jar $1 >nohup.out 2>&1 &
exit 1
fi
if [ $1 = "law-biz-lawyer-1.0.jar" ]
then
echo "启动lawyer"
cd /root/lawyerservice/green
nohup java -jar $1 >nohup.out 2>&1 &
exit 1
fi
if [ $1 = "law-biz-mng-1.0.jar" ]
then
echo "启动mng"
cd /root/mngservice/green
nohup java -jar $1 >nohup.out 2>&1 &
exit 1
fi
最后执行的效果如下
运维大佬勿喷!!!