目前写了一个脚本 目的是一键启动项目的七个服务,6个tomcat 一个springboot jar
#!/bin/bash
RED_COLOR='\E[1;31m'
YELOW_COLOR='\E[1;33m'
BLUE_COLOR='\E[1;34m'
GREEN_COLOR='\E[1;32m'
RESET='\E[0m'
ECHO_RED="echo -e ${RED_COLOR}"
ECHO_YESSOW="echo -e ${YELOW_COLOR}"
ECHO_BLUE="echo -e ${BLUE_COLOR}"
ECHO_GREEN="echo -e ${GREEN_COLOR}"
ECHO_WHITE="echo -e ${RESET}"
WARN_1="please input param such as up or down or logs......"
echoWarnMessage() {
$ECHO_BLUE "Please enter a correct service name such as $1 $2"
}
isServerHaveStarted() {
local param1=$1
# 判断服务是否已经启动
IAM_PID=$(lsof -i:"${psMap[$param1]}" | grep -v 'PID' | awk '{print $2}')
if [ -n "$IAM_PID" ]; then
# echo $param1 ${psMap[$param1]}
echo -e "The service ${GREEN_COLOR} $param1 ${RESET}has been started. Do not start it again"
return "233"
fi
}
# 定义map集合 port service map
declare -A psMap
declare -A execMap
declare -A logMap
psMap=(["bam"]="8081"
["bim"]="8080"
["idp"]="8082"
["apphub"]="8083"
["epass"]="8085"
["bim-console"]="8084"
["cs"]="8759")
execMap=(["bam"]="/data01/tomcat/bam/apache-tomcat-8.5.51/bin/startup.sh"
["bim"]="/data01/tomcat/bim/apache-tomcat-8.5.51/bin/startup.sh"
["idp"]="/data01/tomcat/idp/apache-tomcat-8.5.51/bin/startup.sh"
["apphub"]="/data01/tomcat/apphub/apache-tomcat-8.5.51/bin/startup.sh"
["epass"]="/data01/tomcat/epass/apache-tomcat-8.5.51/bin/startup.sh"
["bim-console"]="/data01/tomcat/config/bcc/bim-configuration/nohup-run.sh"
["cs"]="/data01/tomcat/ConnectorServer/bin/startup.sh /run")
logMap=(["bam"]="/data01/tomcat/bam/apache-tomcat-8.5.51/logs/catalina.out"
["bim"]="/data01/tomcat/bim/apache-tomcat-8.5.51/logs/catalina.out"
["idp"]="/data01/tomcat/idp/apache-tomcat-8.5.51/logs/catalina.out"
["apphub"]="/data01/tomcat/apphub/apache-tomcat-8.5.51/logs/catalina.out"
["epass"]="/data01/tomcat/epass/apache-tomcat-8.5.51/logs/catalina.out"
["bim-console"]="/data01/tomcat/config/bcc/bim-configuration/bim-configuration.log"
["cs"]="/data01/tomcat/ConnectorServer/logs/ConnectorServer.log")
if [ $# -eq 0 ]; then
echo
$ECHO_RED "$WARN_1"
echo
exit
else
if [ $# -eq 1 ]; then
if [ "$1" == 'up' ]; then
for execkey in ${!execMap[*]}; do
$ECHO_WHITE
isServerHaveStarted "$execkey"
if [ $? -eq "233" ]; then
continue
fi
${execMap[$execkey]}
sleep 1.5
$ECHO_GREEN "$execkey has been started!"
done
elif [ "$1" == 'down' ]; then
# 根据端口终止服务
for key in ${!psMap[*]}; do
netstat -nlp | grep :${psMap[$key]} | awk '{print $7}' | awk -F"/" '{ print $1 }' | xargs kill -9
# fuser -k -n tcp "${psMap[$key]}"
$ECHO_GREEN "$key has been stoped!"
done
${ECHO_GREEN} 'all java process has been stopped!'
else
$ECHO_RED "$WARN_1"
fi
elif [ "$#" -gt 1 ] && [ "$1" == 'up' ]; then
runServer=${@:2:$#}
for sname in ${runServer[*]}; do
servercmd=${execMap[$sname]}
if [ ! "$servercmd" ]; then
$ECHO_YESSOW "$sname"'The service does not exist. Skip startup!'
else
$ECHO_WHITE
$servercmd
sleep 1.5
$ECHO_GREEN "$sname" "started!"
fi
done
elif [ "$#" -gt 1 ] && [ "$1" == 'down' ]; then
runServer=${@:2:$#}
for key in ${runServer[*]}; do
if [ ! "${psMap[$key]}" ]; then
$ECHO_YESSOW $key'TheService does not exist, skip stop'
echoWarnMessage "${RED_COLOR}" "${!psMap[*]}"
else
$ECHO_WHITE
netstat -nlp | grep :${psMap[$key]} | awk '{print $7}' | awk -F"/" '{ print $1 }' | xargs kill -9
$ECHO_GREEN "$key has been stoped!"
fi
done
elif [ "$#" -eq 2 ] && [ "$1" == 'logs' ]; then
p2=${logMap[$2]}
if [ ! "$p2" ]; then
$ECHO_YESSOW $key'please input correct server name!'
else
tail -f $p2
fi
else
$ECHO_RED "$WARN_1"
fi
fi
想实现一个功能即是 如果已经启动的服务 再启动则会 根据端口判断 写成了一个函数
这里是返回一个 233
然后再判断返回值是不是233 就跳出循环
我想把continue写在函数里 貌似语法不知吃请问怎么写...
还有根据端口号使用fuser 删除貌似有点问题
这里使用的
netstat -nlp | grep :${psMap[$key]} | awk '{print $7}' | awk -F"/" '{ print $1 }' | xargs kill -9
大家看下还没有优化的空间
我按照你说的试了一下伪代码,continue和返回值都是可以用的,我不明白你说的语法不支持是什么意思?我觉得你这个启动脚本好复杂,如果是我我会把这7个服务分别做成systemctl服务。