server.sh
#!/bin/sh
# Zookeeper
# author [email protected]
# $Id: server.sh 2016-06-30 12:00:00
SERVICE_FLAG=zkClient
SYSTEM_TIME=`date '+%Y-%m-%d %T'`
cd $(dirname $0) && {
SHELL_PATH=`pwd`
cd - &> /dev/null
}
ZOOKEEPER_HOME=${SHELL_PATH}
LOG_PATH=$ZOOKEEPER_HOME/logs
SHELL_PIDFILE=$ZOOKEEPER_HOME/logs/shell.pid
LOG=$ZOOKEEPER_HOME/logs/shell.log
PID_FILE=$ZOOKEEPER_HOME/logs/Zookeeper_pid.log
if [ ! -d "$LOG_PATH" ]; then
mkdir "$LOG_PATH"
fi
if [ ! -f "$PID_FILE" ]; then
touch "$PID_FILE"
fi
function check_shell {
SHELL_PID=`cat $SHELL_PIDFILE 2> /dev/null`
if [ $? -eq 1 ]; then
echo 'no pid file'
else
count=`ps aux | grep -w $SHELL_PID | grep 'server.sh' | grep -v grep | wc -l`
if [ $count -gt 0 ]; then
echo "shell is running pid : $SHELL_PID" >> $LOG
exit
fi
fi
}
date >> $LOG
check_shell
flock -n $SHELL_PIDFILE -c "echo $$ > $SHELL_PIDFILE; sleep 0.5"
//执行失败 则说明进程已存在
if [ $? -eq 1 ]; then
SHELL_PID=`cat $SHELL_PIDFILE 2> /dev/null`
echo "$SHELL_PID is running" >> $LOG
exit
fi
echo "shell pid is $$" >> $LOG
//获取文件锁成功,再次校验shell进程id是否是当前进程id
SHELL_PID=`cat $SHELL_PIDFILE 2 > /dev/null`
if [ ! $SHELL_PID -eq $$ ]; then
echo "pid file is updated by $SHELL_PID; current shell pid is $$" >> $LOG
exit
fi
function start {
cd $ZOOKEEPER_HOME && {
pid=`cat $PID_FILE`
count=`ps aux | grep ${SERVICE_FLAG} | grep -v grep | wc -l`
if [ $count -eq 1 ]; then
echo "Zookeeper is running, pid is $pid"
else
${SHELL_PATH}/${SERVICE_FLAG}
if [ $? -eq 0 ]; then
z_pid=`ps aux | grep ${SERVICE_FLAG} | grep -v grep | awk '{print $2}'`
echo $z_pid>${PID_FILE}
echo "zookeeper start success, pid is `cat $PID_FILE`"
else
echo "zookeeper start fail"
fi
fi
}
}
function stop {
cd $ZOOKEEPER_HOME && {
pid=`cat $PID_FILE`
count=`ps aux | grep -w ${SERVICE_FLAG} | grep -v grep | wc -l`
echo "stop zookeeper , current thread number is $count" >> $LOG
if [ $count -ge 1 ]; then
`ps -ef | grep ${SERVICE_FLAG} | grep -v "grep" | awk '{print $2}' | xargs sudo kill -9`
echo "zookeeper is stoping" >> $LOG
else
echo "stop fail, zookeeper is not running" >> $LOG
fi
}
}
case $1 in
start)
start
exit;;
stop)
stop
exit;;
restart)
stop
start
exit;;
reload)
stop
start
exit;;
*)
echo "invalid arg: $1" >> $LOG;;
esac