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