manage管理脚本
USER=admin
pathTar=/usr/local/static
pathWar=/usr/local/tomcat
pathJar=/usr/local/task
pathRollback=/tmp/rollback
if [[ ! -f ${pathRollback} ]]; then
mkdir -p ${pathRollback}
fi
SHHOME=$(cd `dirname $0`; pwd)
BASEHOME=$(cd $SHHOME/..; pwd)
DATE=$(date +%Y%m%d%H%M)
function print_usage() {
echo "##########################################################"
echo -e "Usage: /bin/bash $0 [\033[31mupdate\033[0m|\033[31mrollback\033[0m|\033[31mstatus\033[0m|\033[31mrestart\033[0m|\033[31mstop\033[0m|\033[31mstart\033[0m] [\033[31mFILENAME\033[0m|\033[31mFURL\033[0m]"
echo -e "eg: /bin/bash $0 update basic-login.war"
echo "##########################################################"
}
function log_error() {
echo -e "\033[31m [ERROR] $@ \033[0m"
}
function log_info() {
echo -e "\033[32m [INFO] $@ \033[0m"
}
function log_warn() {
echo -e "\033[33m [WARN] $@ \033[0m"
}
function judgeFile() {
if [[ ! -f $@ ]] && [[ ! -d $@ ]]; then
log_error "$@ 不存在,请检查"
return 1
else
log_info "$@ 存在,请继续"
return 2
fi
}
function judgePid() {
local name=$1
local num=`ps aux|grep $name | grep -v grep | grep -v $0 | wc -l`
if [[ $num -ne 0 ]]; then
log_info "应用程序: $name 正在运行"
return 2
else
log_warn "应用程序: $name 已经停止"
return 1
fi
}
function stopJar() {
local app_file=$1
local app_name=`echo ${app_file} | awk -F. '{print $1}'`
local app_home=${pathJar}/${app_name}
if [[ ! -d ${app_home} ]]; then
log_warn "此主机节点没有部署${app_file},请检查"
exit
else
continue
fi
log_info "正在停止应用程序: ${app_file}"
ps aux | grep -w ${app_file} | grep -v grep | grep -v $0 | awk '{print $2}' | xargs kill -9 &>/dev/null
sleep 2
judgePid ${app_file}
}
function startJar() {
local app_file=$1
local app_name=`echo ${app_file} | awk -F. '{print $1}'`
local app_home=${pathJar}/${app_name}
if [[ ! -d ${app_home} ]]; then
log_warn "此主机节点没有部署${app_file},请检查"
exit
else
continue
fi
log_info "正在启动应用程序: $app_file"
chown -R ${USER}.${USER} ${app_home}
cd ${app_home} && /bin/bash ${app_name}.sh start
sleep 3
judgePid ${app_file}
}
function updateJar() {
local app_file=$1
local app_name=`echo ${app_file} | awk -F. '{print $1}'`
local app_home=${pathJar}/${app_name}
stopJar ${app_file}
log_info "备份当前运行的Jar包: $app_file"
\mv ${app_home}/${app_file} ${app_home}/${app_file}.${DATE}
log_info "上传新的Jar包: $app_file"
\mv ${SHHOME}/${app_file} ${app_home}/
startJar ${app_name}
}
function rollbackJar() {
local app_file=$1
local app_name=`echo ${app_file} | awk -F. '{print $1}'`
local app_home=${pathJar}/${app_name}
local version=`ls -ltd ${app_home}/${app_file}.* | awk -F. '{print $NF}' | sort -nr | head -n 1`
judgeFile ${app_home}/${app_file}.${version}
stopJar ${app_file}
log_info "备份当前运行的Jar包: $app_file 至 ${pathRollback}"
\mv -b ${app_home}/${app_file} ${pathRollback}/${app_file}
log_info "回滚上一次更新的Jar包: ${app_file}.${version}"
\mv ${app_home}/${app_file}.${version} ${app_home}/${app_file}
startJar ${app_name}
}
function stopWar() {
local app_file=$1
local app_name=`echo ${app_file} | awk -F. '{print $1}'`
local app_home=${pathWar}/${app_name}
if [[ ! -d ${app_home} ]]; then
log_warn "此主机节点没有部署${app_file},请检查"
exit
else
continue
fi
log_info "正在停止应用程序: ${app_file}"
/bin/bash ${app_home}/bin/shutdown.sh &>/dev/null
sleep 2
judgePid ${pathWar}/${app_name}
local value=$?
if [[ ${value} -eq 2 ]]; then
log_info "应用程序: ${app_file} 没有正常关闭,执行 kill -9"
ps aux | grep -w ${app_home} | grep -v grep | grep -v $0 | awk '{print $2}' | xargs kill -9
fi
}
function startWar() {
local app_file=$1
local app_name=`echo ${app_file} | awk -F. '{print $1}'`
local app_home=${pathWar}/${app_name}
if [[ ! -d ${app_home} ]]; then
log_warn "此主机节点没有部署${app_file},请检查"
exit
else
continue
fi
log_info "正在启动应用程序: ${app_file}"
chown -R ${USER}.${USER} ${app_home}
sleep 2
/sbin/runuser -s /bin/bash $USER -c "${app_home}/bin/startup.sh"
log_info "查看日志请执行命令:"
log_info "######## tail -f ${app_home}/logs/catalina.out"
}
function updateWar() {
local app_file=$1
local app_name=`echo ${app_file} | awk -F. '{print $1}'`
local app_home=${pathWar}/${app_name}
stopWar ${app_file}
log_info "备份当前运行的War包: $app_file"
\mv ${app_home}/webapps/${app_file} ${app_home}/webapps/${app_file}.${DATE}
\rm -rf ${app_home}/webapps/${app_name}
log_info "上传新的War包: $app_file"
\mv ${SHHOME}/${app_file} ${app_home}/webapps/
startWar ${app_file}
}
function rollbackWar() {
local app_file=$1
local app_name=`echo ${app_file} | awk -F. '{print $1}'`
local app_home=${pathWar}/${app_name}
local version=`ls -ltd ${app_home}/webapps/${app_file}.* | awk -F. '{print $NF}' | sort -nr | head -n 1`
judgeFile ${app_home}/webapps/${app_file}.${version}
stopWar ${app_file}
log_info "备份当前运行的War包: $app_file 至 ${pathRollback}"
\mv -b ${app_home}/webapps/${app_file} ${pathRollback}/${app_file}
\rm -rf ${app_home}/webapps/${app_name}
log_info "回滚上一次更新的War包: ${app_file}.${version}"
\mv ${app_home}/webapps/${app_file}.${version} ${app_home}/webapps/${app_file}
startWar ${app_file}
}
function updateTar() {
local app_file=$1
local app_name=`echo ${app_file} | awk -F. '{print $1}'`
local app_home=${pathTar}/${app_name}
if [[ ! -d ${app_home} ]]; then
log_warn "此主机节点没有部署${app_file},请检查"
exit
else
continue
fi
log_info "备份当前运行的前端包: ${app_name}"
\mv ${app_home} ${app_home}.${DATE}
log_info "上传新的前端包: ${app_file}"
mkdir -p ${app_home}
tar zxf ${SHHOME}/${app_file} -C ${app_home}
rm -f ${SHHOME}/${app_file}
chown -R ${USER}.${USER} ${pathTar}
log_info "${app_name} 已经更新"
}
function rollbackTar() {
local app_file=$1
local app_name=`echo ${app_file} | awk -F. '{print $1}'`
local app_home=${pathTar}/${app_name}
local version=`ls -ltd ${app_home}.* | awk -F. '{print $NF}' | sort -nr | head -n 1`
judgeFile ${app_home}.${version}
log_info "备份当前运行的前端: ${app_name} 至 ${pathRollback}"
\mv -b ${app_home} ${pathRollback}/${app_name}
log_info "回滚上一次更新的前端静态包: ${app_name}.${version} ..."
\mv ${app_home}.${version} ${app_home}
log_info "${app_name} 已经回滚"
}
function download() {
local url=$1
local app_file=`echo ${url} |awk -F\/ '{print $NF}'`
log_info "下载更新包"
wget -q -P ${SHHOME}/ ${url}
if [[ -f ${SHHOME}/${app_file} ]]; then
if [[ ${app_file} =~ "war" ]]; then
updateWar ${app_file}
elif [[ ${app_file} =~ "jar" ]]; then
updateJar ${app_file}
elif [[ ${app_file} =~ "tar.gz" ]]; then
updateTar ${app_file}
else
log_error "Input error, please input again!"
exit
fi
else
log_error "下载更新包失败,请检查"
fi
}
function update() {
local name=$1
local num=`echo ${name} | grep "jenkins_output" | grep -v grep | wc -l`
if [[ $num -ne 1 ]];then
if [[ ! -f ${SHHOME}/${name} ]]; then
log_warn "没有找到更新包,请先下载更新包至: ${SHHOME}"
exit
else
continue
fi
if [[ ${name} =~ ".war" ]]; then
updateWar ${name}
elif [[ ${name} =~ ".jar" ]]; then
updateJar ${name}
elif [[ ${name} =~ "tar.gz" ]]; then
updateTar ${name}
else
log_error "Input error, please input again!"
fi
else
download ${name}
fi
}
function rollback() {
local name=$1
local app_type=`echo ${name} |awk -F. '{print $NF}'`
if [[ ${app_type} =~ "war" ]]; then
rollbackWar ${name}
elif [[ ${app_type} =~ "jar" ]]; then
rollbackJar ${name}
elif [[ ${app_type} =~ "gz" ]]; then
rollbackTar ${name}
else
log_error "Input error, please input again!"
fi
}
function stop() {
local app_file=$1
local app_name=`echo ${app_file} | awk -F. '{print $1}'`
local app_type=`echo ${app_file} |awk -F. '{print $NF}'`
if [[ ! -d ${pathWar}/${app_name} ]] && [[ ! -d ${pathJar}/${app_name} ]]; then
log_warn "此主机节点没有部署${app_file},请检查"
exit
else
continue
fi
if [[ ${app_type} =~ "war" ]]; then
stopWar ${app_file}
elif [[ ${app_type} =~ "jar" ]]; then
stopJar ${app_file}
else
log_error "Input error, please input again!"
fi
}
function start() {
local app_file=$1
local app_name=`echo ${app_file} | awk -F. '{print $1}'`
local app_type=`echo ${app_file} |awk -F. '{print $NF}'`
if [[ ! -d ${pathWar}/${app_name} ]] && [[ ! -d ${pathJar}/${app_name} ]]; then
log_warn "此主机节点没有部署${app_file},请检查"
exit
else
continue
fi
if [[ ${app_type} =~ "war" ]]; then
startWar ${app_file}
elif [[ ${app_type} =~ "jar" ]]; then
startJar ${app_file}
else
log_error "Input error, please input again!"
fi
}
COMMAND=$1
APPFILE=$2
if [[ $
print_usage
exit
else
continue
fi
case "$COMMAND" in
update)
log_info "开始更新应用: ${APPFILE}"
update ${APPFILE}
;;
rollback)
log_info "开始回滚应用: ${APPFILE}"
rollback ${APPFILE}
;;
status)
judgePid ${APPFILE}
;;
restart)
log_info "开始停止应用: ${APPFILE}"
stop ${APPFILE}
sleep 3
log_info "开始启动应用: ${APPFILE}"
start ${APPFILE}
;;
stop)
log_info "开始停止应用: ${APPFILE}"
stop ${APPFILE}
;;
start)
log_info "开始启动应用: ${APPFILE}"
start ${APPFILE}
;;
*)
print_usage
exit 1
;;
esac