HEX
Server: Apache/2.4.34 (Red Hat) OpenSSL/1.0.2k-fips
System: Linux WORDPRESS 3.10.0-1160.118.1.el7.x86_64 #1 SMP Thu Apr 4 03:33:23 EDT 2024 x86_64
User: digital (1020)
PHP: 7.2.24
Disabled: NONE
Upload Files
File: //usr/local/cloudmonitor/cloudmonitorCtl.sh
#!/bin/sh

#BASE_PATH="/usr/local/cloudmonitor"
SERVICE_EXT=usr
#if [[ -f /etc/os-release && -n "`egrep -i coreos /etc/os-release`" ]];then
#  BASE_PATH="/opt/cloudmonitor"
#  # SERVICE_EXT=opt
#fi
BASE_PATH="$(dirname "$(readlink -f "$0")")"
# BASE_PATH=$(cd "$(dirname "$0")/../.."; pwd) # BASE_PATH的另一种取法

PS_CMD="ps aux"
if [ -x "$(command -v getprop 2>/dev/null)" ]; then
  if [ ! -f /vendor/overlay/wuying_overlay_frameworks_base_core.apk ]; then
    # 根据@刘江(小k) 工号: WB01092715 提供的信息,无影没有直接的判断方法,目前通过这个apk最靠谱
    echo "目前android系统只支持无影,其它发行版尚未开放"
    exit 1
  fi
  IS_ANDROID=1
  PS_CMD="ps -ef"
  # echo "argusagent for android"
fi

SERVICE_NAME=cloudmonitor
SERVICE_FILE="${BASE_PATH}/${SERVICE_NAME}.${SERVICE_EXT}"
SYSTEMD_SERVICE_FILE="${BASE_PATH}/${SERVICE_NAME}.service.${SERVICE_EXT}"
SYSTEMD_SERVICE_NAME="${SERVICE_NAME}.service"

ARGUSAGENT_CMD="${BASE_PATH}/bin/argusagent"
if [ -n "${IS_ANDROID}" ]; then
  ARGUSAGENTD_CMD_LINE="${ARGUSAGENT_CMD}"
  ARGUSAGENT_D_PID_FILE="${BASE_PATH}/local_data/argusagentd-cloudmonitor.pid"
  ARGUSAGENT_PID_FILE="${BASE_PATH}/local_data/argusagent-cloudmonitor.pid"
else
  ARGUSAGENTD_CMD_LINE="${ARGUSAGENT_CMD} -d"
  ARGUSAGENT_D_PID_FILE="/var/run/argusagentd-cloudmonitor.pid"
  ARGUSAGENT_PID_FILE="/var/run/argusagent-cloudmonitor.pid"
fi

case $(uname -m) in
  aarch64)
    ARCH=arm64
    ;;
  arm)
    ARCH=arm
    ;;
  x86_64)
    ARCH="amd64"
    ;;
  *)
    ARCH="386"
    ;;
esac
case $(uname -s) in
  Linux)
    if [ -n "${IS_ANDROID}" ]; then
      CMS_OS="android"
    else
      CMS_OS="linux"
    fi
    ;;
  Darwin)
    CMS_OS="darwin"
    ;;
  *)
    echo "Unsupported OS: $(uname -s)"
    exit 1
    ;;
esac

log_print()
{
  echo "[$(date '+%Y-%m-%d %H:%M:%S %Z')] $@"
}
run()
{
  log_print "$@"
  # eval "$@"
  PROGRAM="$1"
  shift  # 将所有后续参数左移,这样 $1 现在是原来的第二个参数,依此类推
  # 使用 "$@" 来引用所有剩余的参数
  # "$@" 保留了参数之间的分隔,并且正确处理了包含空格或特殊字符的参数
  "${PROGRAM}" "$@"
}

stop_cms_agent()
{
  CMS_GO_AGENT_CMD="CmsGoAgent.$CMS_OS-$ARCH"
  CMS_GO_AGENT_CMDLINE="${BASE_PATH}/${CMS_GO_AGENT_CMD}"
  if [ -f "${CMS_GO_AGENT_CMDLINE}" ];then
    run "${CMS_GO_AGENT_CMDLINE}" stop
    sleep 2
  fi
  CMS_GO_AGENT_PID=$(${PS_CMD} 2>/dev/null|grep -v grep | grep "${CMS_GO_AGENT_CMD}" |awk '{print $2}')
  if [ -n "${CMS_GO_AGENT_PID}" ];then
    run kill -SIGKILL "${CMS_GO_AGENT_PID}"
  fi

  CMS_JAVA_AGENT_CMDLINE="${BASE_PATH}/wrapper/bin/cloudmonitor.sh"
  if [ -f  "${CMS_JAVA_AGENT_CMDLINE}" ];then
    run "${CMS_JAVA_AGENT_CMDLINE}" remove
  fi
}

check_process()
{
  COUNT=0
  if [ -n "$1" ]; then
    PROCESS_ID=$1
    if [ -d "/proc/$1" ]; then
      READ_EXE_LINK="readlink "/proc/$1/exe""
      cmdline=$(${READ_EXE_LINK})
      log_print "${READ_EXE_LINK} => $cmdline"
      # echo "cmdline: $cmdline"
      if [ "$cmdline" = "${ARGUSAGENT_CMD}" ]; then
        COUNT=1
      fi
    else
      COUNT=$(ps -ef | awk '{print $2}' | grep -c -E "^${PROCESS_ID}$")
    fi
    # echo "process($1) count: ${COUNT}"
  fi
}

start_directly()
{
  stop_cms_agent
  # shellcheck disable=SC2086
  log_print ${ARGUSAGENTD_CMD_LINE}
  # 此处需要把argusagentd_cmd_line展开,因此不要加引号
  ${ARGUSAGENTD_CMD_LINE} >/dev/null 2>&1
  sleep 1
  if [ ! -f "${ARGUSAGENT_D_PID_FILE}" ]; then
    sleep 2
  fi
  # sleep 2
  # if [ -f $ARGUSAGENT_D_PID_FILE ];then
  #   argusagentdPid=`cat $ARGUSAGENT_D_PID_FILE`
  #   check_process $argusagentdPid
  #   if [ $COUNT -ne 0 ];then
  #     echo "argusagent start success!"
  #   else
  #     echo "failed to start argusagent!"
  #   fi
  # else
  #   echo "failed to start argusagent!"
  # fi
}

check_daemon_process()
{
  if [ -f "${ARGUSAGENT_D_PID_FILE}" ];then
    argusagentdPid=$(cat ${ARGUSAGENT_D_PID_FILE})
  else
    argusagentdPid=$(${PS_CMD} 2>/dev/null |grep "${ARGUSAGENTD_CMD_LINE}"|grep -v grep|awk '{print $2}')
  fi
  if [ -n "${argusagentdPid}" ]; then
    log_print "argusagent daemon processId: ${argusagentdPid}"
  fi
  check_process $argusagentdPid
}

stop_directly()
{
  # #stop argusagentd
  # if [ -f "${ARGUSAGENT_D_PID_FILE}" ];then
  #   CMD_FIND_ARGUSAGENT_PID="cat ${ARGUSAGENT_D_PID_FILE}"
  #   # argusagentdPid=`cat ${ARGUSAGENT_D_PID_FILE}`
  # else
  #   CMD_FIND_ARGUSAGENT_PID="${PS_CMD} 2>/dev/null |grep \"${ARGUSAGENTD_CMD_LINE}\"|grep -v grep|awk '{print $2}'"
  # fi
  # argusagentdPid=$(${CMD_FIND_ARGUSAGENT_PID})
  # log_print "${CMD_FIND_ARGUSAGENT_PID} => ${argusagentPid}"
  check_daemon_process
  if [ $COUNT -ne 0 ]; then
    run kill -3 $argusagentdPid  # kill -3(SIGQUIT)
    sleep 2
    check_process $argusagentdPid
    if [ $COUNT -ne 0 ];then 
      run kill -9 $argusagentdPid # kill -9(SIGKILL)
      sleep 2
    fi
  fi

  if [ -f "$ARGUSAGENT_PID_FILE" ];then
    argusagentPid=`cat "$ARGUSAGENT_PID_FILE"`
  else 
    argusagentPid=`${PS_CMD} 2>/dev/null | grep "${ARGUSAGENT_CMD}" | grep -v "$ARGUSAGENTD_CMD_LINE"|grep -v grep|awk '{print $2}'`
  fi 
  if [ -n "${argusagentPid}" ]; then
    log_print "argusagent processId: ${argusagentPid}"
  fi
  check_process $argusagentPid
  if [ $COUNT -ne 0 ];then 
    run kill -3 $argusagentPid  # kill -3(SIGQUIT)
    sleep 2
    check_process $argusagentPid
    if [ $COUNT -ne 0 ];then 
      run kill -9 $argusagentPid  # kill -9(SIGKILL)
      sleep 2
    fi
  fi
  if [ -f $ARGUSAGENT_D_PID_FILE ];then
    run rm -f $ARGUSAGENT_D_PID_FILE
  fi
  if [ -f $ARGUSAGENT_PID_FILE ];then
    run rm -f $ARGUSAGENT_PID_FILE
  fi
}

restart()
{
  stop
  if [ ! -f $ARGUSAGENT_D_PID_FILE ]; then
    # 成功停止
    log_print "================================================="
    start
  fi
}

start()
{
  if [ -x "$(command -v systemctl 2>/dev/null)" ]; then
    run systemctl start ${SYSTEMD_SERVICE_NAME}
  elif [ -f /usr/sbin/update-rc.d ]; then
    run /etc/init.d/${SERVICE_NAME} start  # Debian
  elif [ -x "$(command -v service 2>/dev/null)" ]; then
    run service ${SERVICE_NAME} start
  else
    start_directly
  fi

  if [ -f "${ARGUSAGENT_D_PID_FILE}" ];then
    # argusagentdPid=$(cat "${ARGUSAGENT_D_PID_FILE}")
    # check_process $argusagentdPid
    check_daemon_process
    # echo "argusagent count: ${COUNT}"
    if [ $COUNT -ne 0 ];then
      log_print "argusagent start success!"
    else
      log_print "failed to start argusagent: can not find process(pid: ${argusagentdPid})!"
    fi
  else
    log_print "failed to start argusagent: missing ${ARGUSAGENT_D_PID_FILE}"
  fi
}
stop()
{
  if [ -x "$(command -v systemctl 2>/dev/null)" ]; then
    run systemctl stop ${SYSTEMD_SERVICE_NAME}
  elif [ -f /usr/sbin/update-rc.d ]; then
    run /etc/init.d/${SERVICE_NAME} stop
  elif [ -x "$(command -v service 2>/dev/null)" ]; then
    run service ${SERVICE_NAME} stop
  else
    stop_directly
  fi

  if [ ! -f $ARGUSAGENT_D_PID_FILE ]; then
    log_print "argusagent stop success!"
  else
    log_print "argusagent stop failed!"
  fi
}

install()
{
  if [ -x "$(command -v systemctl 2>/dev/null)" ]; then
    #new os
    SYSTEMD_PATH="/usr/lib/systemd/system"
    if [ -d /etc/systemd/system ]; then
      SYSTEMD_PATH="/etc/systemd/system"
    fi
    if [ ! -d ${SYSTEMD_PATH} ]; then
      mkdir -p ${SYSTEMD_PATH}
    fi
    run "${ARGUSAGENT_CMD}" tool replace --file "${SYSTEMD_SERVICE_FILE}" --output-file "${SYSTEMD_PATH}/${SYSTEMD_SERVICE_NAME}" BASE_PATH "${BASE_PATH}"
    # cp -f ${SYSTEMD_SERVICE_FILE} ${SYSTEMD_PATH}/${SYSTEMD_SERVICE_NAME}
    run systemctl enable ${SYSTEMD_SERVICE_NAME}
    run systemctl daemon-reload
  elif [ -f /usr/sbin/update-rc.d ]; then
    #old ubuntu
    #update-rc.d 是Debian 和基于 Debian 的系统(如 Ubuntu)中用来管理系统服务(即守护进程)启动和停止的脚本工具
    # 事实上阿里云的公共镜像中,即使最古老的Debian都有systemctl
    run "${ARGUSAGENT_CMD}" tool replace --file "${SERVICE_FILE}" --output-file "/etc/init.d/${SERVICE_NAME}" BASE_PATH "${BASE_PATH}"
    # cp -f ${SERVICE_FILE} /etc/init.d/${SERVICE_NAME}
    run chmod +x /etc/init.d/${SERVICE_NAME}
    run update-rc.d -f ${SERVICE_NAME} start 20 2 3 4 5 . stop 20 0 1 6 .
  elif [ -f /sbin/chkconfig ]; then
    #old centos, use service command to start/stop
    run "${ARGUSAGENT_CMD}" tool replace --file "${SERVICE_FILE}" --output-file "/etc/init.d/${SERVICE_NAME}" BASE_PATH "${BASE_PATH}"
    # cp -f ${SERVICE_FILE} /etc/init.d/${SERVICE_NAME}
    run chmod +x /etc/init.d/${SERVICE_NAME}
    run chkconfig --add ${SERVICE_NAME}
    run chkconfig --level 2345 ${SERVICE_NAME} on
  else
    echo "unknown os!"
  fi
}

uninstall()
{
  if [ -x "$(command -v systemctl 2>/dev/null)" ]; then
    run systemctl disable ${SYSTEMD_SERVICE_NAME}
  elif [ -f /usr/sbin/update-rc.d ] && [ -f /etc/init.d/${SERVICE_NAME} ];then
    #old ubuntu
    run update-rc.d -f ${SERVICE_NAME} remove
  elif [ -f /sbin/chkconfig ] && [ -f /etc/init.d/${SERVICE_NAME} ];then
    #old centos
    run chkconfig --del ${SERVICE_NAME}
  else
    echo "unknown os!"
   fi 
}
remove()
{
  stop
  uninstall
}

status()
{
  if [ -x "$(command -v systemctl 2>/dev/null)" ]; then
    systemctl status ${SYSTEMD_SERVICE_NAME}
  elif [ -n "${IS_ANDROID}" ]; then
    getprop | grep argusagent-service
  else
    echo "can not find systemctl!!!"
  fi
}

print_help()
{
  if [ -z "${IS_ANDROID}" ]; then
    echo "Usage: $0 {start|stop|restart|status|install|uninstall|remove}"
  else
    echo "Usage: $0 {start|stop|restart|status}"
  fi
}

SCRIPT_CTRL_OPERATION="$1"
CODE=0
case "${SCRIPT_CTRL_OPERATION}" in
  # 直接启停
  start-directly)
    start_directly
  ;;
  stop-directly)
    stop_directly
  ;;
  # 手动通过服务启停
  start)
    start
  ;;
  stop)
    stop
  ;;
  restart)
    restart
  ;;
  status)
    status
    ;;
  *)
    if [ -z "${IS_ANDROID}" ]; then
      case "${SCRIPT_CTRL_OPERATION}" in
        install)
          install
          ;;
        uninstall)
          uninstall
          ;;
        remove)
          remove
          ;;
        *)
          CODE=1
          ;;
      esac
    else
      CODE=1
    fi
    ;;
esac

# echo "cloudmonitorCtl.sh code: ${CODE}"
if [ ${CODE} -ne 0 ]; then
  print_help
fi

exit $CODE