文档章节

shell脚本批量/单独启动、停止、重启java独立jar程序

SummerGao
 SummerGao
发布于 03/20 14:08
字数 1665
阅读 6
收藏 0

参考方式一

service.sh

#!/bin/bash
#####################################################Environment Setting#######################################################

#程序代码数组
APPS=(pushcode thirdpayment security redis commservice wechat point useraccount coupon interest experience dealaccount user send payment sms deal dispatch dealload recv innermsg reward finacial debt pushmsg esign crmda)

#程序名称数组

NAMES=(邀请码模块 第三方支付模块 安全模块 Redis模块 公共服务模块 微信服务模块 积分账户子系统 用户账户子系统 用户模块 队列消息发送模块 支付模块 短信系统 交易系统 消息队列模块 消息队列接收模块 站内信模块 奖励管理模块 结算系统 消息推送模块 电子签章 数据仓库)

#jar包数组

JARS=(pushcode-provider-0.0.1.jar comm-thirdpayment-provider-0.0.1.jar comm-security-provider.jar comm-redis-provider-0.0.1.jar comm-service-provider-0.0.1.jar action-provider-wechat-0.0.1.jar action-provider-point-0.0.1.jar action-provider-useraccount-0.0.1.jar action-provider-user-0.0.1.jar comm-message-send-provider-0.0.1.jar action-provider-payment-0.0.1.jar action-provider-sms-0.0.1.jar action-provider-deal-0.0.1.jar message-recv-dealload-0.0.1.jar comm-message-recv-provider-0.0.1.jar action-provider-innermsg-0.0.1.jar action-provider-reward-0.0.1.jar action-provider-finacial-0.0.1.jar message-pushmsg-0.0.1.jar provider-esign-0.0.1.jar provider-crmda-0.0.1.jar)

#jar包路径数组

PATHS=(/application/provider/pushcode /application/provider/thirdpayment /application/provider/security /application/provider/redis /application/provider/commservice /application/provider/wechat /application/provider/point /application/provider/useraccount  /application/provider/user /application/provider/message/send /application/provider/payment /application/provider/sms /application/provider/deal  /application/provider/message/dealload /application/provider/message/recv /application/provider/innermsg /application/provider/reward /application/provider/finacial /application/provider/pushmsg /application/provider/esign /application/provider/crmda)

start(){
local APPNAME=
local NAME=
local CLASSNAME=
local PROJECTDIR=
local command="sh service.sh start"
local cmd2="$1"
local cmd2ok=0
local cnt=0
local okcnt=0
#local C_PID="0"
#for i in `seq 0 22`
echo "---------------------------开始启动服务..."
for(( i=0;i<${#APPS[@]};i++))
do
APPNAME=${APPS[$i]}
NAME=${NAMES[$i]}
CLASSNAME=${JARS[$i]}
PROJECTDIR=${PATHS[$i]}
if [ "$cmd2" == "all" ] || [ "$cmd2" == "$APPNAME" ]; then
cmd2ok=1
C_PID="0"
cnt=0
#ps -ef | grep "$CLASSNAME" | awk '{print $2}' | while read pid
PID=`ps -ef |grep $(echo $CLASSNAME |awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`	
#do 
#C_PID=$(ps --no-heading $pid | wc -l)
#if [ "$C_PID" == "1" ]; then
if [ -n "$PID" ]
then
echo "$APPNAME---$NAME:己经运行,PID=$PID"
#okcnt=$(($okcnt+1))
else
cd $PROJECTDIR
rm -f $PROJECTDIR/nohup.out
command="nohup java -jar $CLASSNAME"
exec $command >> $PROJECTDIR/nohup.out &
#ps -ef | grep "$CLASSNAME" | awk '{print $2}' | while read pid
#do
# C_PID=$(ps --no-heading $pid | wc -l)
#done
PID=`ps -ef |grep $(echo $CLASSNAME |awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`	
cnt=0
#while (("$C_PID" == "0"))
while [ -z "$PID" ]
do
if (($cnt==30))
then
echo "$APPNAME---$NAME:$cnt秒内未启动,请检查!"
break
fi
cnt=$(($cnt+1))
sleep 1s
#ps -ef | grep "$CLASSNAME" | awk '{print $2}' | while read pid
#do
# C_PID=$(ps --no-heading $pid | wc -l)
#done
PID=`ps -ef |grep $(echo $CLASSNAME |awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`	
done
okcnt=$(($okcnt+1))
echo "$APPNAME---$NAME:己经成功启动,PID=$PID"
#出借模块和总装模块启动较慢
if [ "$APPNAME" == "deal" ] ;
then
echo "$APPNAME---$NAME:启动中..."
sleep 30s
fi	
if [ "$APPNAME" == "dispatch" ] ;
then
echo "$APPNAME---$NAME:启动中..."
sleep 10s
fi
fi 
#done	
fi
done
if (($cmd2ok==0))
then
echo "command2: all|pushcode|thirdpayment|security|redis|commservice|wechat|point|useraccount|coupon|interest|experience|dealaccount|user|send|payment|sms|deal|dispatch|dealload|recv|innermsg|reward|finacial|debt" 
else
echo "---------------------------本次启动:$okcnt个服务"
fi
}

stop(){ 
local APPNAME=
local CLASSNAME=
local PROJECTDIR=
local command="sh service.sh stop"
local cmd2="$1"
local cmd2ok=0
#local C_PID="0"
local okcnt=0
echo "---------------------------开始停止服务..."
for(( i=0;i<${#APPS[@]};i++))
do
APPNAME=${APPS[$i]}
NAME=${NAMES[$i]}
CLASSNAME=${JARS[$i]}
PROJECTDIR=${PATHS[$i]}
if [ "$cmd2" == "all" ] || [ "$cmd2" == "$APPNAME" ]; then
cmd2ok=1
#ps -ef | grep "$CLASSNAME" | awk '{print $2}' | while read PID 
PID=`ps -ef |grep $(echo $CLASSNAME |awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`	
#do 
#C_PID=$(ps --no-heading $PID | wc -l)
#if [ "$C_PID" == "1" ]; then
if [ -n "$PID" ]
then
echo "$NAME:PID=$PID准备结束"
kill $PID
#C_PID=$(ps --no-heading $PID | wc -l)
#while (("$C_PID" == "1"))
PID=`ps -ef |grep $(echo $CLASSNAME |awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
while [ -n "$PID" ]
do
sleep 1s
#C_PID=$(ps --no-heading $PID | wc -l)
PID=`ps -ef |grep $(echo $CLASSNAME |awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
done
echo "$NAME:成功结束"
okcnt=$(($okcnt+1))
else
echo "$NAME:未运行"
fi 
#done 
fi
done
if (($cmd2ok==0))
then
echo "command2: all|pushcode|thirdpayment|security|redis|commservice|wechat|point|useraccount|coupon|interest|experience|dealaccount|user|send|payment|sms|deal|dispatch|dealload|recv|innermsg|reward|finacial|debt" 
else
echo "---------------------------本次共停止:$okcnt个服务" 
fi
}

case "$1" in 
start) 
start "$2"
exit 1
;; 
stop) 
stop "$2"
;; 
restart) 
stop "$2"
start "$2"
;; 
*) 
echo "command1: start|stop|restart" 
exit 1 
;; 
esac

linux命令用法:

1.启动所有jar程序:sh service.sh start all

2.停止所有jar程序:sh service.sh stop all

3.重启所有jar程序:sh service.sh restart all

4.单独启动、停止、重启某个jar程序:把最后面的all替换为某个jar程序的代码即可

参考方式二

all.sh

#! /bin/sh
# 端口号
PORTS=(8084 8083 8085 8086)
# 系统模块
MODULES=(mcht system user act)
# 系统模块名称
MODULE_NAMES=(商户模块 系统模块 用户模块 活动模块)
# jar包数组
JARS=(mcht-1.0.1-SNAPSHOT.jar system-1.0.1-SNAPSHOT.jar user-1.0.1-SNAPSHOT.jar act-1.0.1-SNAPSHOT.jar)
# jar包路径
JAR_PATH='/usr/local/beta'
# 日志路径
LOG_PATH='/usr/local/beta'
start() {
  local MODULE=
  local MODULE_NAME=
  local JAR_NAME=
  local command="$1"
  local commandOk=0
  local count=0
  local okCount=0
  local port=0
  for((i=0;i<${#MODULES[@]};i++))
  do
    MODULE=${MODULES[$i]}
    MODULE_NAME=${MODULE_NAMES[$i]}
    JAR_NAME=${JARS[$i]}
    PORT=${PORTS[$i]}
    if [ "$command" == "all" ] || [ "$command" == "$MODULE" ];then
      commandOk=1
      count=0
      PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
      if [ -n "$PID" ];then
        echo "$MODULE---$MODULE_NAME:已经运行,PID=$PID"
      else
        exec nohup java -jar $JAR_PATH/$JAR_NAME >> $LOG_PATH/nohup.out &
        PID=`netstat -apn | grep $PORT | awk '{print $7}' | cut -d/ -f 1`
        while [ -z "$PID" ]
        do
          if (($count == 30));then
            echo "$MODULE---$MODULE_NAME:$(expr $count \* 10)秒内未启动,请检查!"
            break
          fi
          count=$(($count+1))
          echo "$MODULE_NAME启动中.................."
          sleep 10s
          PID=`netstat -apn | grep $PORT | awk '{print $7}' | cut -d/ -f 1`
        done
        okCount=$(($okCount+1))
        echo "$MODULE---$MODULE_NAME:已经启动成功,PID=$PID"
      fi
    fi
  done
  if(($commandOk == 0));then
    echo "第二个参数请输入:mcht|system|user|act"
  else
    echo "............本次共启动:$okCount个服务..........."
  fi
}
 
stop() {
  local MODULE=
  local MODULE_NAME=
  local JAR_NAME=
  local command="$1"
  local commandOk=0
  local okCount=0
  for((i=0;i<${#MODULES[@]};i++))
  do
    MODULE=${MODULES[$i]}
    MODULE_NAME=${MODULE_NAMES[$i]}
    JAR_NAME=${JARS[$i]}
    if [ "$command" = "all" ] || [ "$command" = "$MODULE" ];then
      commandOk=1
      PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
      if [ -n "$PID" ];then
        echo "$MODULE---$MODULE_NAME:准备结束,PID=$PID"
        kill -9 $PID
        PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
        while [ -n "$PID" ]
        do
          sleep 3s
          PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
        done
        echo "$MODULE---$MODULE_NAME:成功结束"
        okCount=$(($okCount+1))
      else
        echo "$MODULE---$MODULE_NAME:未运行"
      fi
    fi
  done
  if (($commandOk == 0));then
    echo "第二个参数请输入:mcht|system|user|act"
  else
    echo "............本次共停止:$okCount个服务............"
  fi
}
 
 
case "$1" in
  start)
    start "$2"
  ;;
  stop)
    stop "$2"
  ;;
  restart)
    stop "$2"
    sleep 3s
    start "$2"
  ;;
  *)
    echo "第一个参数请输入:start|stop|restart"
    exit 1
  ;;
esac

1.启动所有jar包:sh all.sh start all 或者./sh start all

2.停止所有jar包:sh all.sh stop all 或者./sh stop all

3.重启所有jar包:sh all.sh restart all 或者./sh restart all

4.重启或者停止单个jar包,只需要将all替换为相应的模块代码就行

参考运行问题记录及解决办法:

1.执行sh ./xxx.sh出现:“Syntax error: “(” unexpected”的解决方法

代码对于标准bash而言没有错,因为Ubuntu/Debian为了加快开机速度,用dash代替了传统的bash,是dash在捣鬼,解决方法就是取消dash。

sudo dpkg-reconfigure dash

在选择项中选No,就搞定了!

2.运行脚本文件报错.sh: line 1: $'\r': command not found

移除文件中的\r即可:

sed -i 's/\r$//' filename

 

本文转载自:https://www.cnblogs.com/jxrichar/p/5744940.html

SummerGao
粉丝 4
博文 221
码字总数 85051
作品 0
济南
高级程序员
私信 提问
多个平台的 Java Launcher 脚本

通常对于服务来说,过长的命令往往让人感到厌烦,人们需要的只是简单的操作,并且能够支持复杂的功能,对于 Java 开发的服务来说更是如此。 一个比较复杂的 Jar 服务使用Java启动,命令如下 ...

Force武装卫队
2015/06/09
3.3K
8
请教linux下java调用shell实现自动重启的问题

应用场景是实现java程序的远程升级,java程序运行在linux下,是一个后台一直运行的服务。 大概流程如下: 1.java程序判断接收到升级包,调用linux shell脚本来进行升级 Runtime.getRuntime()...

风之刀
2017/06/06
385
0
通过Shell脚本用JDBC连数据库脱离项目框架执行Java业务流程

一.概述 如果项目中需要使用到定时任务来完成某些业务,一般有两种做法:定时任务依赖于项目;定时任务用批处理(windows执行)或者shell脚本(Linux)启动,不依赖于项目。 个人觉得,定时任...

谢思华
2015/08/10
607
0
Linux 下shell启动Java Main函数脚本

#!/bin/sh # #该脚本为Linux下启动java程序的通用脚本。即可以作为开机自启动service脚本被调用, #也可以作为启动java程序的独立脚本来使用。 #警告!!!:该脚本stop部分使用系统kill命令来强...

心月狐
2018/05/14
0
0
用supervisord管理杂乱的服务

Supervisord是用Python实现的一款非常实用的进程管理工具,在批量服务化管理时特别有效。 环境 centos python2.4 安装 wget http://pypi.python.org/packages/source/s/supervisor/superviso...

wx---羊毛联盟
2011/12/14
401
0

没有更多内容

加载失败,请刷新页面

加载更多

会用python把linux命令写一遍的人,进大厂有多容易?

看过这篇《2000字谏言,给那些想学Python的人,建议收藏后细看!》的读者应该都对一个命令有点印象吧?没错,就是 linux 中经常会用到的 ls 命令。 文章中我就提到如何提升自己的 python 能力...

上海小胖
8分钟前
1
0
HashMap的特性

一、hashmap数据结构:哈希表结构:数组+链表 hashmap调用默认构造方法会产生一个默认底层是长度为16的Entry数组,首先调用key的hasCode()方法来得到一个整数, int hash = hash(key.hashCode...

GGbird
9分钟前
2
0
第五章 spring-connet之Imports注解来龙去脉

前言 imports是一个在spring体系里非常重要的注解,基本每个Enable开头的注解必然有一个import注解。接下来我们深入研究下import的作用。看小节的同学建议先取看PostProcessorRegistrationDe...

鸟菜啊
12分钟前
1
0
CentOS部署Harbor镜像仓库

关于Harbor Harbor是用于存储和分发Docker镜像的镜像仓库服务,相比Docker Registry,Harbor在安全、标识、管理等方面做了增强,更适合企业使用; 官方网站:https://goharbor.io/ 官方开源:...

程序员欣宸
17分钟前
1
0
JavaScript调试必会的8个console方法

每个JavaScript开发者都用过console.log()来调试程序,但实际上Console对象还提供了很多其他方法可以提高调试效率。本文将介绍8个有趣的Console方法,即使JavaScript老手也不一定知道! 1、c...

汇智网教程
39分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部