shell脚本中的函数返回一个函数

目前写了一个脚本 目的是一键启动项目的七个服务,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

想实现一个功能即是 如果已经启动的服务 再启动则会 根据端口判断 写成了一个函数

image.png

这里是返回一个 233

然后再判断返回值是不是233 就跳出循环

image.png

我想把continue写在函数里 貌似语法不知吃请问怎么写...

还有根据端口号使用fuser 删除貌似有点问题

这里使用的

netstat -nlp | grep :${psMap[$key]} | awk '{print $7}' | awk -F"/" '{ print $1 }' | xargs kill -9

大家看下还没有优化的空间

阅读 2.5k
2 个回答

我按照你说的试了一下伪代码,continue和返回值都是可以用的,我不明白你说的语法不支持是什么意思?我觉得你这个启动脚本好复杂,如果是我我会把这7个服务分别做成systemctl服务。

可能可以考虑用pid信息来进行管理,这个更符合linux下标准的服务管理情况。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题