本周刚好研究了一下dubbo的启动脚本,所以在官网的启动脚本和公司内部的启动脚本做了一个整理,弄了一份比較通过的Dubbo应用启动和停止脚本。

         以下的脚本仅仅应用于配置分离的应用。什么叫做配置分离呢?就是使用maven打包时,借助assemble插件。打一个tar.gz的压缩包。

里面有三个文件夹。bin文件夹。用来存放启动与停止的脚本,lib文件夹,用来存放相关依赖的jar包,注意。这里每一个jar包都是单独的。而不是一个大的jar包。conf文件夹,用来存放配置文件。包含dubbo.property,applicatiom.xml等文件。

project解压后例如以下图:

本文脚本免费下载

1、启动脚本

具体的凝视都已写在脚本中,请看具体的凝视

#!/bin/bash
cd `dirname $0` #当前路径
BIN_DIR=`pwd` #向上一层路径
cd ..
DEPLOY_DIR=`pwd`
echo $DEPLOY_DIR #配置文件路径
CONF_DIR=$DEPLOY_DIR/conf
#日志输出路径
LOGS_DIR=$DEPLOY_DIR/logs # 假设JDK环境变量没有写到全局要加入例如以下几行
# JAVA_HOME=/opt/java/jdk1.6.0_45
# PATH=$JAVA_HOME/bin:$PATH
# export JAVA_HOME
# export PATH #从dubbo.properties取得应用名、端口号,端口名
SERVER_NAME=`sed '/dubbo.application.name/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`
SERVER_PROTOCOL_NAME=`sed '/dubbo.protocol.name/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`
SERVER_PROTOCOL_PORT=`sed '/dubbo.protocol.port/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'` #应用名为空的话就取当前系统名
if [ -z "$SERVER_NAME" ]; then
echo "SERVER_NAME is empty"
SERVER_NAME=`hostname`
fi #依据配置文件路径去查找当前是否已有dubbo应用启动起来
APP_PID=`ps -ef -ww | grep "java" | grep " -DappName=$SERVER_NAME " | awk '{print $2}'`
echo "SERVER_NAME: $SERVER_NAME"
echo "SERVER_PROTOCOL_NAME: $SERVER_PROTOCOL_NAME"
echo "SERVER_PROTOCOL_PORT: $SERVER_PROTOCOL_PORT"
echo "APP_PID: $APP_PID" #APP_PID不为空,说明应用已启动,直接退出
if [ -n "$APP_PID" ]; then
echo "ERROR: The $SERVER_NAME already started!"
echo "PID: $APP_PID"
exit 1
fi #检查端口是否被占用
if [ -n "$SERVER_PROTOCOL_PORT" ]; then
SERVER_PORT_COUNT=`netstat -tln | grep $SERVER_PROTOCOL_PORT | wc -l`
if [ $SERVER_PORT_COUNT -gt 0 ]; then
echo "ERROR: The $SERVER_NAME port $SERVER_PROTOCOL_PORT already used!"
exit 1
fi
fi #假设logs文件夹不存在,就创建一个
if [ ! -d $LOGS_DIR ]; then
mkdir $LOGS_DIR
fi echo "LOGS_DIR :$LOGS_DIR" #控制台日志输出收集位置
STDOUT_FILE=$LOGS_DIR/stdout.log #依赖jar包文件夹
LIB_DIR=$DEPLOY_DIR/lib #将上面的jar文件名,拼接上lib的路径然后输出
LIB_JARS=`ls $LIB_DIR|grep .jar|awk '{print "'$LIB_DIR'/"$0}'|tr "\n" ":"` #-DappName指定应用名
JAVA_OPTS="-DappName=$SERVER_NAME -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Ddubbo.shutdown.hook=true" #调试模式
JAVA_DEBUG_OPTS=""
if [ "$1" = "debug" ]; then
JAVA_DEBUG_OPTS=" -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n "
fi
JAVA_JMX_OPTS=""
if [ "$1" = "jmx" ]; then
JAVA_JMX_OPTS=" -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false "
fi #首先将java版本号号信息输出到标准输出,然后查找’64-bit’信息,目的就是推断jdk版本号是否为64位 JAVA_MEM_OPTS=""
BITS=`java -version 2>&1 | grep -i 64-bit` #JVM启动基本參数,这里依据应用自行调整
JAVA_MEM_SIZE_OPTS="-Xmx768m -Xms378m -Xmn256m -XX:PermSize=64m -XX:MaxPermSize=256M -Xss256k" #依据32位和64位配置不同的启动java垃圾回收參数,依据应用自行调整
if [ -n "$BITS" ]; then
JAVA_MEM_OPTS=" -server $JAVA_MEM_SIZE_OPTS -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 "
else
JAVA_MEM_OPTS=" -server $JAVA_MEM_SIZE_OPTS -XX:SurvivorRatio=2 -XX:+UseParallelGC "
fi echo -e "Starting the $SERVER_NAME ...\c"
echo "启动參数:java $JAVA_OPTS $JAVA_MEM_OPTS $JAVA_DEBUG_OPTS $JAVA_JMX_OPTS $JAVA_PROPERTIES_OPTS -classpath $CONF_DIR:$LIB_JARS com.alibaba.dubbo.container.Main" #通过java命令启动服务,同一时候将其作为后台任务运行。
nohup java $JAVA_OPTS $JAVA_MEM_OPTS $JAVA_DEBUG_OPTS $JAVA_JMX_OPTS -classpath $CONF_DIR:$LIB_JARS com.alibaba.dubbo.container.Main > $STDOUT_FILE 2>&1 & #睡眠一下再检查应用是否启动。以下这里凝视打开的话。就把最以下的那一段凝视掉
#sleep 1
#APP_PID=`ps -f | grep java | grep "$CONF_DIR" |awk '{print $2}'` #if [ -z "$APP_PID" ]; then
#echo "START APP FAIL!"
#echo "STDOUT: $STDOUT_FILE"
#exit 1
#fi #echo "START SUCCESSED APP_PID: $APP_PID"
#echo "STDOUT: $STDOUT_FILE" #grep -c 阻止正常的结果输出。转而输出匹配的结果数量,这里就是输出OK的个数。 COUNT=0
while [ $COUNT -lt 1 ]; do
echo -e ".\c"
sleep 1
if [ -n "$SERVER_PROTOCOL_PORT" ]; then
if [ "$SERVER_PROTOCOL_NAME" == "dubbo" ]; then
COUNT=`echo status | nc -i 1 127.0.0.1 $SERVER_PROTOCOL_PORT | grep -c OK`
else
COUNT=`netstat -an | grep $SERVER_PROTOCOL_PORT | wc -l`
fi
else
COUNT=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}' | wc -l`
fi
if [ $COUNT -gt 0 ]; then
break
fi
done
echo "OK!"
APP_PID=`ps -ef -ww | grep "java" | grep " -DappName=$SERVER_NAME " | awk '{print $2}'`
echo "START SUCCESSED APP_PID: $APP_PID"
echo "STDOUT: $STDOUT_FILE"

直接运行上面脚本sh start.sh。输出内容例如以下:

到logs/stdout.log可查看具体启动过程以及失败信息等

还能够使用命令ps -ef|grep java确定应用是否起来:

或者看Dubbo的监控页面也可查看服务是否注冊上去:

2、停止

停止就更加简单了,就是依据应用名找到pid。然后kill。

#!/bin/bash
cd `dirname $0` #当前路径
BIN_DIR=`pwd` #向上一层路径
cd ..
DEPLOY_DIR=`pwd`
echo $DEPLOY_DIR #配置文件路径
CONF_DIR=$DEPLOY_DIR/conf
#日志输出路径
LOGS_DIR=$DEPLOY_DIR/logs # 假设JDK环境变量没有写到全局要加入例如以下几行
# JAVA_HOME=/opt/java/jdk1.6.0_45
# PATH=$JAVA_HOME/bin:$PATH
# export JAVA_HOME
# export PATH #从dubbo.properties取得应用名、端口号。端口名
SERVER_NAME=`sed '/dubbo.application.name/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`
SERVER_PROTOCOL_NAME=`sed '/dubbo.protocol.name/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`
SERVER_PROTOCOL_PORT=`sed '/dubbo.protocol.port/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'` #应用名为空的话就取当前系统名
if [ -z "$SERVER_NAME" ]; then
echo "SERVER_NAME is empty"
SERVER_NAME=`hostname`
fi #依据配置文件路径去查找当前是否已有dubbo应用启动起来
APP_PID=`ps -ef -ww | grep "java" | grep " -DappName=$SERVER_NAME " | awk '{print $2}'`
echo "SERVER_NAME: $SERVER_NAME"
echo "SERVER_PROTOCOL_NAME: $SERVER_PROTOCOL_NAME"
echo "SERVER_PROTOCOL_PORT: $SERVER_PROTOCOL_PORT"
echo "APP_PID: $APP_PID" #APP_PID不为空,说明应用已启动,直接退出
if [ -n "$APP_PID" ]; then
echo "ERROR: The $SERVER_NAME already started!"
echo "PID: $APP_PID"
exit 1
fi #检查端口是否被占用
if [ -n "$SERVER_PROTOCOL_PORT" ]; then
SERVER_PORT_COUNT=`netstat -tln | grep $SERVER_PROTOCOL_PORT | wc -l`
if [ $SERVER_PORT_COUNT -gt 0 ]; then
echo "ERROR: The $SERVER_NAME port $SERVER_PROTOCOL_PORT already used!"
exit 1
fi
fi #假设logs文件夹不存在。就创建一个
if [ ! -d $LOGS_DIR ]; then
mkdir $LOGS_DIR
fi echo "LOGS_DIR :$LOGS_DIR" #控制台日志输出收集位置
STDOUT_FILE=$LOGS_DIR/stdout.log #依赖jar包文件夹
LIB_DIR=$DEPLOY_DIR/lib #将上面的jar文件名,拼接上lib的路径然后输出
LIB_JARS=`ls $LIB_DIR|grep .jar|awk '{print "'$LIB_DIR'/"$0}'|tr "\n" ":"` #-DappName指定应用名
JAVA_OPTS="-DappName=$SERVER_NAME -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Ddubbo.shutdown.hook=true" #调试模式
JAVA_DEBUG_OPTS=""
if [ "$1" = "debug" ]; then
JAVA_DEBUG_OPTS=" -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n "
fi
JAVA_JMX_OPTS=""
if [ "$1" = "jmx" ]; then
JAVA_JMX_OPTS=" -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false "
fi #首先将java版本号号信息输出到标准输出,然后查找’64-bit’信息,目的就是推断jdk版本号是否为64位 JAVA_MEM_OPTS=""
BITS=`java -version 2>&1 | grep -i 64-bit` #JVM启动基本參数,这里依据应用自行调整
JAVA_MEM_SIZE_OPTS="-Xmx768m -Xms378m -Xmn256m -XX:PermSize=64m -XX:MaxPermSize=256M -Xss256k" #依据32位和64位配置不同的启动java垃圾回收參数,依据应用自行调整
if [ -n "$BITS" ]; then
JAVA_MEM_OPTS=" -server $JAVA_MEM_SIZE_OPTS -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 "
else
JAVA_MEM_OPTS=" -server $JAVA_MEM_SIZE_OPTS -XX:SurvivorRatio=2 -XX:+UseParallelGC "
fi echo -e "Starting the $SERVER_NAME ...\c"
echo "启动參数:java $JAVA_OPTS $JAVA_MEM_OPTS $JAVA_DEBUG_OPTS $JAVA_JMX_OPTS $JAVA_PROPERTIES_OPTS -classpath $CONF_DIR:$LIB_JARS com.alibaba.dubbo.container.Main" #通过java命令启动服务,同一时候将其作为后台任务运行。
nohup java $JAVA_OPTS $JAVA_MEM_OPTS $JAVA_DEBUG_OPTS $JAVA_JMX_OPTS -classpath $CONF_DIR:$LIB_JARS com.alibaba.dubbo.container.Main > $STDOUT_FILE 2>&1 & #睡眠一下再检查应用是否启动,以下这里凝视打开的话。就把最以下的那一段凝视掉
#sleep 1
#APP_PID=`ps -f | grep java | grep "$CONF_DIR" |awk '{print $2}'` #if [ -z "$APP_PID" ]; then
#echo "START APP FAIL!"
#echo "STDOUT: $STDOUT_FILE"
#exit 1
#fi #echo "START SUCCESSED APP_PID: $APP_PID"
#echo "STDOUT: $STDOUT_FILE" #grep -c 阻止正常的结果输出,转而输出匹配的结果数量。这里就是输出OK的个数。
COUNT=0
while [ $COUNT -lt 1 ]; do
echo -e ".\c"
sleep 1
if [ -n "$SERVER_PROTOCOL_PORT" ]; then
if [ "$SERVER_PROTOCOL_NAME" == "dubbo" ]; then
COUNT=`echo status | nc -i 1 127.0.0.1 $SERVER_PROTOCOL_PORT | grep -c OK`
else
COUNT=`netstat -an | grep $SERVER_PROTOCOL_PORT | wc -l`
fi
else
COUNT=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}' | wc -l`
fi
if [ $COUNT -gt 0 ]; then
break
fi
done
echo "OK!"
APP_PID=`ps -ef -ww | grep "java" | grep " -DappName=$SERVER_NAME " | awk '{print $2}'`
echo "START SUCCESSED APP_PID: $APP_PID"
echo "STDOUT: $STDOUT_FILE"

sh stop.sh

运行后输出结果:

具体的输出日志可用/logs/shell.log文件查看

假设想输出dump文件,运行

sh stop.sh dump

当中dump.sh内容例如以下:

#!/bin/bash
cd `dirname $0`
BIN_DIR=`pwd`
cd ..
DEPLOY_DIR=`pwd`
CONF_DIR=$DEPLOY_DIR/conf # 假设JDK环境变量没有写到全局要加入例如以下几行
# JAVA_HOME=/opt/java/jdk1.6.0_45
# PATH=$JAVA_HOME/bin:$PATH
# export JAVA_HOME
# export PATH SERVER_NAME=`sed '/^app.process.name/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'` if [ -z "$SERVER_NAME" ]; then
SERVER_NAME=`hostname`
fi PIDS=`ps -ef -ww | grep "java" | grep " -DappName=$SERVER_NAME " | awk '{print $2}'`
if [ -z "$PIDS" ]; then
echo "ERROR: The $SERVER_NAME does not started!"
exit 1
fi LOGS_DIR=$DEPLOY_DIR/logs
if [ ! -d "$LOGS_DIR" ]; then
mkdir -p "$LOGS_DIR"
fi
DUMP_DIR=$LOGS_DIR/dump
if [ ! -d $DUMP_DIR ]; then
mkdir $DUMP_DIR
fi
DUMP_DATE=`date +%Y%m%d%H%M%S`
DATE_DIR=$DUMP_DIR/$DUMP_DATE
if [ ! -d $DATE_DIR ]; then
mkdir $DATE_DIR
fi echo -e "Dumping the $SERVER_NAME ...\c"
for PID in $PIDS ; do
jstack $PID > $DATE_DIR/jstack-$PID.dump 2>&1
echo -e ".\c"
jinfo $PID > $DATE_DIR/jinfo-$PID.dump 2>&1
echo -e ".\c"
jstat -gcutil $PID > $DATE_DIR/jstat-gcutil-$PID.dump 2>&1
echo -e ".\c"
jstat -gccapacity $PID > $DATE_DIR/jstat-gccapacity-$PID.dump 2>&1
echo -e ".\c"
jmap $PID > $DATE_DIR/jmap-$PID.dump 2>&1
echo -e ".\c"
jmap -heap $PID > $DATE_DIR/jmap-heap-$PID.dump 2>&1
echo -e ".\c"
jmap -histo $PID > $DATE_DIR/jmap-histo-$PID.dump 2>&1
echo -e ".\c"
if [ -r /usr/sbin/lsof ]; then
/usr/sbin/lsof -p $PID > $DATE_DIR/lsof-$PID.dump
echo -e ".\c"
fi
done if [ -r /bin/netstat ]; then
/bin/netstat -an > $DATE_DIR/netstat.dump 2>&1
echo -e ".\c"
fi
if [ -r /usr/bin/iostat ]; then
/usr/bin/iostat > $DATE_DIR/iostat.dump 2>&1
echo -e ".\c"
fi
if [ -r /usr/bin/mpstat ]; then
/usr/bin/mpstat > $DATE_DIR/mpstat.dump 2>&1
echo -e ".\c"
fi
if [ -r /usr/bin/vmstat ]; then
/usr/bin/vmstat > $DATE_DIR/vmstat.dump 2>&1
echo -e ".\c"
fi
if [ -r /usr/bin/free ]; then
/usr/bin/free -t > $DATE_DIR/free.dump 2>&1
echo -e ".\c"
fi
if [ -r /usr/bin/sar ]; then
/usr/bin/sar > $DATE_DIR/sar.dump 2>&1
echo -e ".\c"
fi
if [ -r /usr/bin/uptime ]; then
/usr/bin/uptime > $DATE_DIR/uptime.dump 2>&1
echo -e ".\c"
fi echo "OK!"
echo "DUMP: $DATE_DIR"

这是dump文件

本文脚本免费下载

Dubbo应用启动与停止脚本,超具体解析的更多相关文章

  1. linux下lampp的启动和停止脚本

    今天试着写了lampp的启动停止脚本,和上一篇的tomcat的启动停止有一点小区别,就是lampp启动之后有很多的进程号,如果按照tomcat的停止脚本写就会出错,下面做细细的介绍 1.lampp的停 ...

  2. Jenkins启动、停止脚本

    1.jenkins下载地址:http://pan.baidu.com/s/1o79ZRzs 2.创建shell脚本,如:jenkins.sh #!/bin/bash pid=`ps -ef | gre ...

  3. shell 启动和停止脚本

    启动脚本 start_kmeans_v3.sh #!/bin/bash #用于kmeans_data_v3_hadle启动 ps -ef | grep kmeans_data_v3_hadle.py ...

  4. Linux Oracle服务启动&停止脚本与开机自启动

    在CentOS 6.3下安装完Oracle 10g R2,重开机之后,你会发现Oracle没有自行启动,这是正常的,因为在Linux下安装Oracle的确不会自行启动,必须要自行设定相关参数,首先先介 ...

  5. Elasticsearch启动、停止脚本

    注:本文出自博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 本文源链接:https://www.cnblogs.com/chloneda/p/es-shell ...

  6. zookeeper 启动和停止脚本

    启动 sh zkServer.sh start 停止脚本 sh zkServer.sh stop

  7. jar包的启动和停止脚本

    启动: #!/bin/sh PIDFILE="/app/eureka/eureka.pid" LOGFILE="/app/eureka/out.log" if ...

  8. 双 MySQL 启动、停止脚本

    5.5 启动 #!/bin/bash # author: Wang Xiaoqiang # func: Start MySQL 5.5 pid=`netstat -lnpt | awk -F '[ / ...

  9. tomcat启动和停止脚本

    #!/bin/bash JDK_HOME=/apps/jdk1.7.0_79 CATALINA_HOME=/apps/tomcat export JDK_HOME CATALINA_HOME sour ...

随机推荐

  1. django踩坑

    django输入localhost或者127.0.0.1可以进入,输入自己ip报错 结局方案: 首先找到自己的项目的setting.py文件 找到——> ALLOWED_HOSTS = [] 修 ...

  2. centeros 6 远程升级ssl ssh 的shell脚本

    变量说明 SSL_N=openssl-1.0.2p #ssl 版本SSH_N=openssh-7.9p1 #ssh 版本ZLIB_N=zlib-1.2.11 # zlib 版本 脚本分为两个,因为升级 ...

  3. linux shell 自动判断操作系统release 然后连接FTP yum源的脚本

    如何搭建本地yum源见附录① 如何搭建FTP yum源见附录② 脚本正文: #!/bin/sh# CenterOS config yumOSV=`rpm -q --qf %{version} cent ...

  4. 标量子查询SQL改写

    一网友说下面sql跑的好慢,让我看看 sql代码: select er, cid, pid, tbl, zs, sy, (select count(sr.mobile_tele_no) from tb ...

  5. POJ 1201 Intervals(差分约束 区间约束模版)

    关于差分约束详情可阅读:http://www.cppblog.com/menjitianya/archive/2015/11/19/212292.html 题意: 给定n个区间[L,R], 每个区间至 ...

  6. 记第一次开发安卓应用——IT之家RSS阅读器

    这个学期学校开了安卓的课程,因为自己一直学习wp的开发,一直用的是.net和Silverlight这一套,也着实没有太多时间投入安卓的方向去,因为想着毕业也不从事安卓的工作,所以也一直没有怎么研究.但 ...

  7. XV6上下文切换

    上下文切换分为两种情况 用户程序陷入到内核,再从内核返回 两个应用程序之间的上下文切换 用户程序陷入到内核 用户程序陷入到内核通过中断INT指令,在xv6中系统调用的号为64 操作系统在初始化的时候会 ...

  8. 81. Spring Boot集成JSP疑问【从零开始学Spring Boot】

    [原创文章,转载请注明出处] 针对文章: ()Spring Boot 添加JSP支持[从零开始学Spring Boot] 有网友提了这么一些疑问: 1.Spring Boot使用jsp时,仍旧可以打成 ...

  9. poj2446 Chessboard 【最大匹配】

    题目大意:一个n*m的棋盘,某些格子不能用,问用1*2的骨牌能否完全覆盖这个棋盘,当然,骨牌不能有重叠 思路:显然黑白染色后,一个骨牌只能覆盖一个白色格子和一个黑色格子,然后我们间二染色建图,看能否有 ...

  10. 【USACO】wormholes 【暴力】

    题意:给出2K个平面上的点,给它们一一配对,问有多少种配对方法使得存在从某个点一直向右走会陷在循环里(K<=6) 思路:由于k很小,配对方法的话暴力枚举,然后判环,判环时需要注意的是一条直线上的 ...