在没有自动部署的环境下,如果调试java 服务,每次都需要kill掉之前的服务,然后再启动,虽然整个过程也只涉及如下三个命令,但是频繁调试时还是让人很崩溃的。
ps -ef | grep myjar#myjar为服务名
kill -9 123456 #假设myjar的线程号为123456
nohup java -jar -Xms1024m -Xms2048m myjar.jar & # 习惯使用nohup从后台启动。-Xms为jvm 参数,&不要漏了
封装成shell 脚本如下,命名为run.sh:
普通版
jar包提前打好了,这里只需为此jar包定制特定的脚本
#1,获取myjar的进程号
PID=$(ps -ef|grep myjar| grep -v grep | awk '{print $2}')
#2,启动myjar的函数
start(){
nohup java -jar -Xms1024m -Xms2048m myjar.jar -p -i &
}
#3,判断1中获取的PID是否存在,即判断myjar有没有启动
if [ -z "$PID" ]
then
#4,日志
echo "Sart the myjar directly "
#5,myjar之前没有启动的话,这里直接调用start函数
start
else
#6,myjar之前启动过且进程依然存活,则kill掉,然后调用start函数
echo "kill the existing myjar process firstly."
kill -9 $PID
echo " $PID has been killed"
start
fi
注: run.sh的权限需要设置成当前用户可以执行的状态,由于脚本中涉及到kill 命令,建议使用root权限执行。关于修改文件权限请学习chmod命令
进阶版
服务器上装有git,jar包通过mvn命令package,每次打包前是基于当前最新的代码,因此需要行执行git pull. 一般运维人员,不会将root权限赋予git, 所以需要普通用户去执行run,但run中的kill前需要加上sudo . 完整脚本如下:
#get the pid
PID=$(ps -ef|grep myjar| grep -v grep | awk '{print $2}')
start(){
echo "======Ready to build project======"
mvn clean package -Dmaven.test.skip=true #是否跳过unit test,true 为跳过
# mvn clean package -P uat -Dmaven.test.skip=true #是否跳过unit test,true 为跳过.
#-P指的是profile,uat指的是测试环境,pom中配置了profile才需要加上
#-P 环境
echo "======Build finished, ready to run======"
nohup /usr/java/bin/java -jar -Xms1024m -Xms2048m target/myjar.jar &
tail -f nohup.out
}
echo "======Ready to get latest code from repository======"
git pull
if [ -z "$PID" ]
then
echo "Sart the myjar directly "
start
else
echo "kill the existing myjar process firstly."
sudo kill -9 $PID # sudo一定要加
echo " $PID has been killed"
start
fi
下次启动时,进入到run.sh所在目录直接./run.sh,没有进入到所在目录则需要带上目录,例如./x/x/x/run.sh