本周刚好研究了一下dubbo的启动脚本,所以在官网的启动脚本和公司内部的启动脚本做了一个整理,弄了一份比较通过的Dubbo应用启动和停止脚本。
下面的脚本只应用于配置分离的应用,什么叫做配置分离呢?就是使用maven打包时,借助assemble插件,打一个tar.gz的压缩包。里面有三个目录。bin目录,用来存放启动与停止的脚本,lib目录,用来存放相关依赖的jar包,注意,这里每个jar包都是单独的,而不是一个大的jar包。conf目录,用来存放配置文件,包括dubbo.property,applicatiom.xml等文件。
工程解压后如下图:
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.h