Dubbo(3)——应用启动与停止脚本,超详细解析

来源:互联网 发布:嘉实优化红利 编辑:程序博客网 时间:2024/06/08 07:03

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

         下面的脚本只应用于配置分离的应用,什么叫做配置分离呢?就是使用maven打包时,借助assemble插件,打一个tar.gz的压缩包。里面有三个目录。bin目录,用来存放启动与停止的脚本,lib目录,用来存放相关依赖的jar包,注意,这里每个jar包都是单独的,而不是一个大的jar包。conf目录,用来存放配置文件,包括dubbo.property,applicatiom.xml等文件。

工程解压后如下图:



本文脚本免费下载

1、启动脚本

详细的注释都已写在脚本中,请看具体的注释

[plain] view plain copy
  1. #!/bin/bash  
  2. cd `dirname $0`  
  3.   
  4. #当前路径  
  5. BIN_DIR=`pwd`  
  6.   
  7. #向上一层路径  
  8. cd ..  
  9. DEPLOY_DIR=`pwd`  
  10. echo $DEPLOY_DIR  
  11.   
  12. #配置文件路径  
  13. CONF_DIR=$DEPLOY_DIR/conf  
  14. #日志输出路径  
  15. LOGS_DIR=$DEPLOY_DIR/logs  
  16.   
  17. # 如果JDK环境变量没有写到全局要添加如下几行  
  18. # JAVA_HOME=/opt/java/jdk1.6.0_45  
  19. # PATH=$JAVA_HOME/bin:$PATH  
  20. # export JAVA_HOME  
  21. # export PATH  
  22.   
  23. #从dubbo.properties取得应用名、端口号,端口名  
  24. SERVER_NAME=`sed '/dubbo.application.name/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`  
  25. SERVER_PROTOCOL_NAME=`sed '/dubbo.protocol.name/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`  
  26. SERVER_PROTOCOL_PORT=`sed '/dubbo.protocol.port/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`  
  27.   
  28. #应用名为空的话就取当前系统名  
  29. if [ -z "$SERVER_NAME" ]; then  
  30.     echo "SERVER_NAME is empty"  
  31.     SERVER_NAME=`hostname`  
  32. fi  
  33.   
  34. #根据配置文件路径去查找当前是否已有dubbo应用启动起来  
  35. APP_PID=`ps -ef -ww | grep "java" | grep " -DappName=$SERVER_NAME " | awk '{print $2}'`  
  36. echo "SERVER_NAME: $SERVER_NAME"  
  37. echo "SERVER_PROTOCOL_NAME: $SERVER_PROTOCOL_NAME"  
  38. echo "SERVER_PROTOCOL_PORT: $SERVER_PROTOCOL_PORT"  
  39. echo "APP_PID: $APP_PID"   
  40.   
  41. #APP_PID不为空,说明应用已启动,直接退出  
  42. if [ -n "$APP_PID" ]; then  
  43.     echo "ERROR: The $SERVER_NAME already started!"  
  44.     echo "PID: $APP_PID"  
  45.     exit 1  
  46. fi  
  47.   
  48. #检查端口是否被占用  
  49. if [ -n "$SERVER_PROTOCOL_PORT" ]; then  
  50.     SERVER_PORT_COUNT=`netstat -tln | grep $SERVER_PROTOCOL_PORT | wc -l`  
  51.     if [ $SERVER_PORT_COUNT -gt 0 ]; then  
  52.         echo "ERROR: The $SERVER_NAME port $SERVER_PROTOCOL_PORT already used!"  
  53.         exit 1  
  54.     fi  
  55. fi  
  56.   
  57.   
  58. #如果logs目录不存在,就创建一个  
  59. if [ ! -d $LOGS_DIR ]; then  
  60.     mkdir $LOGS_DIR  
  61. fi  
  62.   
  63. echo "LOGS_DIR :$LOGS_DIR"  
  64.   
  65. #控制台日志输出收集位置  
  66. STDOUT_FILE=$LOGS_DIR/stdout.log  
  67.   
  68. #依赖jar包目录  
  69. LIB_DIR=$DEPLOY_DIR/lib  
  70.   
  71. #将上面的jar文件名称,拼接上lib的路径然后输出  
  72. LIB_JARS=`ls $LIB_DIR|grep .jar|awk '{print "'$LIB_DIR'/"$0}'|tr "\n" ":"`  
  73.   
  74. #-DappName指定应用名  
  75. JAVA_OPTS="-DappName=$SERVER_NAME -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Ddubbo.shutdown.hook=true"  
  76.   
  77. #调试模式  
  78. JAVA_DEBUG_OPTS=""  
  79. if [ "$1" = "debug" ]; then  
  80.     JAVA_DEBUG_OPTS=" -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n "  
  81. fi  
  82. JAVA_JMX_OPTS=""  
  83. if [ "$1" = "jmx" ]; then  
  84.     JAVA_JMX_OPTS=" -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false "  
  85. fi  
  86.   
  87.   
  88. #首先将java版本号信息输出到标准输出,然后查找’64-bit’信息,目的就是判断jdk版本是否为64位  
  89.   
  90. JAVA_MEM_OPTS=""  
  91. BITS=`java -version 2>&1 | grep -i 64-bit`  
  92.   
  93. #JVM启动基本参数,这里根据应用自行调整  
  94. JAVA_MEM_SIZE_OPTS="-Xmx768m -Xms378m -Xmn256m -XX:PermSize=64m -XX:MaxPermSize=256M -Xss256k"  
  95.   
  96. #根据32位和64位配置不同的启动java垃圾回收参数,根据应用自行调整  
  97. if [ -n "$BITS" ]; then  
  98.     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 "  
  99. else  
  100.     JAVA_MEM_OPTS=" -server $JAVA_MEM_SIZE_OPTS -XX:SurvivorRatio=2 -XX:+UseParallelGC "  
  101. fi  
  102.   
  103. echo -e "Starting the $SERVER_NAME ...\c"  
  104. 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"  
  105.   
  106. #通过java命令启动服务,同时将其作为后台任务执行。  
  107. 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 &  
  108.   
  109. #睡眠一下再检查应用是否启动,下面这里注释打开的话,就把最下面的那一段注释掉  
  110. #sleep 1  
  111. #APP_PID=`ps -f | grep java | grep "$CONF_DIR" |awk '{print $2}'`  
  112.   
  113. #if [ -z "$APP_PID" ]; then  
  114.     #echo "START APP FAIL!"  
  115.     #echo "STDOUT: $STDOUT_FILE"  
  116.     #exit 1  
  117. #fi  
  118.   
  119. #echo "START  SUCCESSED APP_PID: $APP_PID"  
  120. #echo "STDOUT: $STDOUT_FILE"  
  121.   
  122.   
  123. #grep -c 阻止正常的结果输出,转而输出匹配的结果数量,这里就是输出OK的个数。  
  124. COUNT=0  
  125. while [ $COUNT -lt 1 ]; do      
  126.     echo -e ".\c"  
  127.     sleep 1  
  128.     if [ -n "$SERVER_PROTOCOL_PORT" ]; then  
  129.         if [ "$SERVER_PROTOCOL_NAME" == "dubbo" ]; then  
  130.             COUNT=`echo status | nc -i 1 127.0.0.1 $SERVER_PROTOCOL_PORT | grep -c OK`  
  131.         else  
  132.             COUNT=`netstat -an | grep $SERVER_PROTOCOL_PORT | wc -l`  
  133.         fi  
  134.     else  
  135.         COUNT=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}' | wc -l`  
  136.     fi  
  137.     if [ $COUNT -gt 0 ]; then  
  138.         break  
  139.     fi  
  140. done  
  141. echo "OK!"  
  142. APP_PID=`ps -ef -ww | grep "java" | grep " -DappName=$SERVER_NAME " | awk '{print $2}'`  
  143. echo "START  SUCCESSED APP_PID: $APP_PID"  
  144. echo "STDOUT: $STDOUT_FILE"  
直接执行上面脚本sh start.sh,输出内容如下:


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


还可以使用命令ps -ef|grep Java确定应用是否起来:


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


2、停止

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

[plain] view plain copy
  1. #!/bin/bash  
  2. cd `dirname $0`  
  3.   
  4. #当前路径  
  5. BIN_DIR=`pwd`  
  6.   
  7. #向上一层路径  
  8. cd ..  
  9. DEPLOY_DIR=`pwd`  
  10. echo $DEPLOY_DIR  
  11.   
  12. #配置文件路径  
  13. CONF_DIR=$DEPLOY_DIR/conf  
  14. #日志输出路径  
  15. LOGS_DIR=$DEPLOY_DIR/logs  
  16.   
  17. # 如果JDK环境变量没有写到全局要添加如下几行  
  18. # JAVA_HOME=/opt/java/jdk1.6.0_45  
  19. # PATH=$JAVA_HOME/bin:$PATH  
  20. # export JAVA_HOME  
  21. # export PATH  
  22.   
  23. #从dubbo.properties取得应用名、端口号,端口名  
  24. SERVER_NAME=`sed '/dubbo.application.name/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`  
  25. SERVER_PROTOCOL_NAME=`sed '/dubbo.protocol.name/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`  
  26. SERVER_PROTOCOL_PORT=`sed '/dubbo.protocol.port/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`  
  27.   
  28. #应用名为空的话就取当前系统名  
  29. if [ -z "$SERVER_NAME" ]; then  
  30.     echo "SERVER_NAME is empty"  
  31.     SERVER_NAME=`hostname`  
  32. fi  
  33.   
  34. #根据配置文件路径去查找当前是否已有dubbo应用启动起来  
  35. APP_PID=`ps -ef -ww | grep "java" | grep " -DappName=$SERVER_NAME " | awk '{print $2}'`  
  36. echo "SERVER_NAME: $SERVER_NAME"  
  37. echo "SERVER_PROTOCOL_NAME: $SERVER_PROTOCOL_NAME"  
  38. echo "SERVER_PROTOCOL_PORT: $SERVER_PROTOCOL_PORT"  
  39. echo "APP_PID: $APP_PID"   
  40.   
  41. #APP_PID不为空,说明应用已启动,直接退出  
  42. if [ -n "$APP_PID" ]; then  
  43.     echo "ERROR: The $SERVER_NAME already started!"  
  44.     echo "PID: $APP_PID"  
  45.     exit 1  
  46. fi  
  47.   
  48. #检查端口是否被占用  
  49. if [ -n "$SERVER_PROTOCOL_PORT" ]; then  
  50.     SERVER_PORT_COUNT=`netstat -tln | grep $SERVER_PROTOCOL_PORT | wc -l`  
  51.     if [ $SERVER_PORT_COUNT -gt 0 ]; then  
  52.         echo "ERROR: The $SERVER_NAME port $SERVER_PROTOCOL_PORT already used!"  
  53.         exit 1  
  54.     fi  
  55. fi  
  56.   
  57.   
  58. #如果logs目录不存在,就创建一个  
  59. if [ ! -d $LOGS_DIR ]; then  
  60.     mkdir $LOGS_DIR  
  61. fi  
  62.   
  63. echo "LOGS_DIR :$LOGS_DIR"  
  64.   
  65. #控制台日志输出收集位置  
  66. STDOUT_FILE=$LOGS_DIR/stdout.log  
  67.   
  68. #依赖jar包目录  
  69. LIB_DIR=$DEPLOY_DIR/lib  
  70.   
  71. #将上面的jar文件名称,拼接上lib的路径然后输出  
  72. LIB_JARS=`ls $LIB_DIR|grep .jar|awk '{print "'$LIB_DIR'/"$0}'|tr "\n" ":"`  
  73.   
  74. #-DappName指定应用名  
  75. JAVA_OPTS="-DappName=$SERVER_NAME -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Ddubbo.shutdown.hook=true"  
  76.   
  77. #调试模式  
  78. JAVA_DEBUG_OPTS=""  
  79. if [ "$1" = "debug" ]; then  
  80.     JAVA_DEBUG_OPTS=" -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n "  
  81. fi  
  82. JAVA_JMX_OPTS=""  
  83. if [ "$1" = "jmx" ]; then  
  84.     JAVA_JMX_OPTS=" -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false "  
  85. fi  
  86.   
  87.   
  88. #首先将java版本号信息输出到标准输出,然后查找’64-bit’信息,目的就是判断jdk版本是否为64位  
  89.   
  90. JAVA_MEM_OPTS=""  
  91. BITS=`java -version 2>&1 | grep -i 64-bit`  
  92.   
  93. #JVM启动基本参数,这里根据应用自行调整  
  94. JAVA_MEM_SIZE_OPTS="-Xmx768m -Xms378m -Xmn256m -XX:PermSize=64m -XX:MaxPermSize=256M -Xss256k"  
  95.   
  96. #根据32位和64位配置不同的启动java垃圾回收参数,根据应用自行调整  
  97. if [ -n "$BITS" ]; then  
  98.     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 "  
  99. else  
  100.     JAVA_MEM_OPTS=" -server $JAVA_MEM_SIZE_OPTS -XX:SurvivorRatio=2 -XX:+UseParallelGC "  
  101. fi  
  102.   
  103. echo -e "Starting the $SERVER_NAME ...\c"  
  104. 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"  
  105.   
  106. #通过java命令启动服务,同时将其作为后台任务执行。  
  107. 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 &  
  108.   
  109. #睡眠一下再检查应用是否启动,下面这里注释打开的话,就把最下面的那一段注释掉  
  110. #sleep 1  
  111. #APP_PID=`ps -f | grep java | grep "$CONF_DIR" |awk '{print $2}'`  
  112.   
  113. #if [ -z "$APP_PID" ]; then  
  114.     #echo "START APP FAIL!"  
  115.     #echo "STDOUT: $STDOUT_FILE"  
  116.     #exit 1  
  117. #fi  
  118.   
  119. #echo "START  SUCCESSED APP_PID: $APP_PID"  
  120. #echo "STDOUT: $STDOUT_FILE"  
  121.   
  122.   
  123. #grep -c 阻止正常的结果输出,转而输出匹配的结果数量,这里就是输出OK的个数。  
  124. COUNT=0  
  125. while [ $COUNT -lt 1 ]; do      
  126.     echo -e ".\c"  
  127.     sleep 1  
  128.     if [ -n "$SERVER_PROTOCOL_PORT" ]; then  
  129.         if [ "$SERVER_PROTOCOL_NAME" == "dubbo" ]; then  
  130.             COUNT=`echo status | nc -i 1 127.0.0.1 $SERVER_PROTOCOL_PORT | grep -c OK`  
  131.         else  
  132.             COUNT=`netstat -an | grep $SERVER_PROTOCOL_PORT | wc -l`  
  133.         fi  
  134.     else  
  135.         COUNT=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}' | wc -l`  
  136.     fi  
  137.     if [ $COUNT -gt 0 ]; then  
  138.         break  
  139.     fi  
  140. done  
  141. echo "OK!"  
  142. APP_PID=`ps -ef -ww | grep "java" | grep " -DappName=$SERVER_NAME " | awk '{print $2}'`  
  143. echo "START  SUCCESSED APP_PID: $APP_PID"  
  144. echo "STDOUT: $STDOUT_FILE"  

sh stop.sh

执行后输出结果:


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

如果想输出dump文件,执行

sh stop.sh dump

其中dump.sh内容如下:

[plain] view plain copy
  1. #!/bin/bash  
  2. cd `dirname $0`  
  3. BIN_DIR=`pwd`  
  4. cd ..  
  5. DEPLOY_DIR=`pwd`  
  6. CONF_DIR=$DEPLOY_DIR/conf  
  7.   
  8. # 如果JDK环境变量没有写到全局要添加如下几行  
  9. # JAVA_HOME=/opt/java/jdk1.6.0_45  
  10. # PATH=$JAVA_HOME/bin:$PATH  
  11. # export JAVA_HOME  
  12. # export PATH  
  13.   
  14. SERVER_NAME=`sed '/^app.process.name/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`  
  15.   
  16. if [ -z "$SERVER_NAME" ]; then  
  17.     SERVER_NAME=`hostname`  
  18. fi  
  19.   
  20. PIDS=`ps -ef -ww | grep "java" | grep " -DappName=$SERVER_NAME " | awk '{print $2}'`  
  21. if [ -z "$PIDS" ]; then  
  22.     echo "ERROR: The $SERVER_NAME does not started!"  
  23.     exit 1  
  24. fi  
  25.   
  26. LOGS_DIR=$DEPLOY_DIR/logs  
  27. if [ ! -d "$LOGS_DIR" ]; then  
  28.     mkdir -p "$LOGS_DIR"  
  29. fi  
  30. DUMP_DIR=$LOGS_DIR/dump  
  31. if [ ! -d $DUMP_DIR ]; then  
  32.     mkdir $DUMP_DIR  
  33. fi  
  34. DUMP_DATE=`date +%Y%m%d%H%M%S`  
  35. DATE_DIR=$DUMP_DIR/$DUMP_DATE  
  36. if [ ! -d $DATE_DIR ]; then  
  37.     mkdir $DATE_DIR  
  38. fi  
  39.   
  40. echo -e "Dumping the $SERVER_NAME ...\c"  
  41. for PID in $PIDS ; do  
  42.     jstack $PID > $DATE_DIR/jstack-$PID.dump 2>&1  
  43.     echo -e ".\c"  
  44.     jinfo $PID > $DATE_DIR/jinfo-$PID.dump 2>&1  
  45.     echo -e ".\c"  
  46.     jstat -gcutil $PID > $DATE_DIR/jstat-gcutil-$PID.dump 2>&1  
  47.     echo -e ".\c"  
  48.     jstat -gccapacity $PID > $DATE_DIR/jstat-gccapacity-$PID.dump 2>&1  
  49.     echo -e ".\c"  
  50.     jmap $PID > $DATE_DIR/jmap-$PID.dump 2>&1  
  51.     echo -e ".\c"  
  52.     jmap -heap $PID > $DATE_DIR/jmap-heap-$PID.dump 2>&1  
  53.     echo -e ".\c"  
  54.     jmap -histo $PID > $DATE_DIR/jmap-histo-$PID.dump 2>&1  
  55.     echo -e ".\c"  
  56.     if [ -r /usr/sbin/lsof ]; then  
  57.     /usr/sbin/lsof -p $PID > $DATE_DIR/lsof-$PID.dump  
  58.     echo -e ".\c"  
  59.     fi  
  60. done  
  61.   
  62. if [ -r /bin/netstat ]; then  
  63. /bin/netstat -an > $DATE_DIR/netstat.dump 2>&1  
  64. echo -e ".\c"  
  65. fi  
  66. if [ -r /usr/bin/iostat ]; then  
  67. /usr/bin/iostat > $DATE_DIR/iostat.dump 2>&1  
  68. echo -e ".\c"  
  69. fi  
  70. if [ -r /usr/bin/mpstat ]; then  
  71. /usr/bin/mpstat > $DATE_DIR/mpstat.dump 2>&1  
  72. echo -e ".\c"  
  73. fi  
  74. if [ -r /usr/bin/vmstat ]; then  
  75. /usr/bin/vmstat > $DATE_DIR/vmstat.dump 2>&1  
  76. echo -e ".\c"  
  77. fi  
  78. if [ -r /usr/bin/free ]; then  
  79. /usr/bin/free -t > $DATE_DIR/free.dump 2>&1  
  80. echo -e ".\c"  
  81. fi  
  82. if [ -r /usr/bin/sar ]; then  
  83. /usr/bin/sar > $DATE_DIR/sar.dump 2>&1  
  84. echo -e ".\c"  
  85. fi  
  86. if [ -r /usr/bin/uptime ]; then  
  87. /usr/bin/uptime > $DATE_DIR/uptime.dump 2>&1  
  88. echo -e ".\c"  
  89. fi  
  90.   
  91. echo "OK!"  
  92. echo "DUMP: $DATE_DIR"  
这是dump文件

本文脚本免费下载

阅读全文
0 0
原创粉丝点击