同一应用docker版本和非docker版本共存下,利用shell脚本获取非docker版本pid

问题场景:在同一VM上部署了同一应用的docker版本和非docker版本,在基于非docke版本应用做jenkins CI/CD时,通过ps -ef操作获取应用的pid,会受到docker版本应用的干扰,如下

以上只有pid=2948为非docker应用。

在之前 spring boot jar项目启停脚本 基础上增加getAppPid()函数,如下

## 0 - docker disabled; 1 - docker enabled
DOCKER_ENABLED=1

getAppPid() {
  local flag=1
  PIDS=$(ps --no-heading -C java -f --width 1000 | grep $1 | awk '{print $2}')
  ARR_PIDS=($PIDS)
  #echo "PIDS=${ARR_PIDS[*]}"
  if [ $DOCKER_ENABLED -eq 1 ]
  then
    PIDS_DOCKER=$(docker inspect -f '{{.State.Pid}}' $(docker ps -q))
    #ARR_PIDS_DOCKER=($PIDS_DOCKER)
    #echo "PIDS_DOCKER=${ARR_PIDS_DOCKER[*]}"
    for idx in "${!ARR_PIDS[@]}"
    do
      flag=0
      for pidd in $PIDS_DOCKER ; do
        if [ "${ARR_PIDS[$idx]}" -eq "$pidd" ]; then
          #echo "find docker pidd=${ARR_PIDS[$idx]}"
          flag=1
          break
        fi
      done
      if [ $flag -eq 0 ]; then
        #echo "get non-docker PID=${ARR_PIDS[$idx]}"
        res[${#res[@]}]=${ARR_PIDS[$idx]}
      fi
    done
  else
    res=(${ARR_PIDS[*]})
  fi
  echo ${res[*]}
}

将原来 

ps --no-heading -C java -f --width 1000 | grep $JAR_NAME | awk '{print $2}'

替换成

getAppPid $JAR_NAME

posted on 2022-10-16 16:48  -赶鸭子上架-  阅读(59)  评论(0编辑  收藏  举报