Linux启动java服务脚本

在没有自动部署的环境下,如果调试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

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