这几天接触了一下shell脚本,闲来没事,记录下学习心得:
(脚本功能:优化svn启动 关闭 更新命令,去掉繁杂的系统提示,输出自定义提示信息并加入流程控制)
#chkconfig: 35 85 15
#布署的时候改成对应的项目根目录就OK
. /etc/rc.d/init.d/functions
SHOW_PROJ_NAME=show
MANAGE_PROJ_NAME=manage
BASE_DIRECTORY=/xx/x/qic/web/
#PID_FILE=$DIRECTORY/server.pid
#LOG_FILE=$DIRECTORY/logs/system.out
#play脚本位置
DEAMON=/usr/local/play1.2.x_cust/play
#java安装目录
export JAVA_HOME=/usr/local/jdk1.6.0_33/
export LANG="en_US.UTF-8"
RET_VAL=0;
function start()
{
#判断"$BASE_DIRECTORY$1/server.pid" 文件是否存在
if [ -f "$BASE_DIRECTORY$1/server.pid" ]
then
failure
echo "$1服务运行中,请先关闭"
else
# echo "开始启动。。。"
#把启动play时的系统提示转移到/dev/null,当前输入界面只显示自定义提示
cd $BASE_DIRECTORY$1 && $DEAMON start>/dev/null
success
echo "$1服务启动成功"
fi
}
function stop()
{
if [ -f "$BASE_DIRECTORY$1/server.pid" ]
then
cd $BASE_DIRECTORY$1 && $DEAMON stop>/dev/null;
sleep 3
if [ -f "$BASE_DIRECTORY$1/server.pid" ]
then
#play 意外中止不会删除pid文件,手动删除
rm -f $BASE_DIRECTORY$1/server.pid
fi
success
echo "$1停止成功"
else
failure
echo "$1没启动"
fi
}
function status()
{
if [ -f "$BASE_DIRECTORY$1/server.pid" ]
then
pid=$(cat $BASE_DIRECTORY$1/server.pid)
$(getMode $1)
#前一个命令的返回码 这里是 function getMode()的返回值
mode=$?
if [ $mode -eq 1 ];
then
success
echo "$1运行中. PID为:$pid,运行模式:生产模式"
else
success
echo "$1运行中. PID为:$pid,运行模式:开发模式"
fi
#cat:从命令行给出的文件中读取数据,并将这些数据直接送到标准输出,这里是读取.pid文件的内容
#cat $BASE_DIRECTORY$1/server.pid
# echo ""
else
failure
echo "$1未运行"
fi
}
# 0:开发模式 1 生产模式
function getMode()
{
#搜索$BASE_DIRECTORY$1/conf/application.conf文件 是否匹配正则"/^application.mode=dev/p" -n 表示字符长度大于0 返回true
mode=$(sed -n "/^application.mode=dev/p" $BASE_DIRECTORY$1/conf/application.conf)
#
if [ ${#mode} -gt 0 ]
then
return 0
else
#echo "test"
return 1
fi
#mode_in_chinese=$(( "$mode" = "application.mode=dev"?"开发模式":"生产模式" ))
#echo $mode_in_chinese
#$($mode = "application.mode=dev") && echo "开发模式2" || echo "生产模式2"
# return "未知模式"
}
function update()
{
#-d : 当"$BASE_DIRECTORY" 是一个文件时 返回true
if [ -d "$BASE_DIRECTORY" ]
then
success
cd $BASE_DIRECTORY && svn update || echo "更新失败" && exit 1
RET_VAL=0
else
failure
echo "$BASE_DIRECTORY不是目录"
RET_VAL=1
fi
return $RETVAL
}
#-----------shell脚本从这里开始执行-------------
#$#表示包括$0在内的命令行参数的个数。在Shell中,脚本名称本身是$0,剩下的依次是$0、$1、$2…、${10}、${11},等等。$*表示整个参数列表,不包括$0,也就是说不包括文件名的参数列表
case $1 in
'start')
#start的时候也调用restart 因为当play异常关闭后server.pid还在 此时若调用start命令并不能重启
$0 restart
;;
'stop')
stop $SHOW_PROJ_NAME
stop $MANAGE_PROJ_NAME
;;
'restart')
stop $SHOW_PROJ_NAME
sleep 1
start $SHOW_PROJ_NAME
sleep 1
stop $MANAGE_PROJ_NAME
sleep 1
start $MANAGE_PROJ_NAME
;;
'status')
status $SHOW_PROJ_NAME
status $MANAGE_PROJ_NAME
;;
'update')
update
;;
*)
echo "usage: service qic <start|stop|status|restart|update>"
;;
esac
exit 0