达梦数据库 DM8 part3_dm_service_uninstaller.sh

#!/bin/sh
#
# dm_service_uninstaller.sh This shell script takes care of uninstall dm service from 
#   the rc.d or systemd of the OS
#
# dameng database co,. ltd.
# tech@dameng.com

DM_HOME="/home/dm/dmdbms"
OS_NAME=`uname`
if [ "$OS_NAME" = "SunOS" -o "$OS_NAME" = "AIX" -o "$OS_NAME" = "HP-UX" ]
then
	echonsign=""
	echosnsign="\c"
else
	echonsign="-n"
	echosnsign=""
fi

usage()
{
	echo "Usage: `basename "$0"` [-n service_name]"
}

show_help()
{
	usage
	printf "%-10s%s\n" "   -n" "服务名,删除指定服务"
	printf "%-10s%s\n" "   -h" "帮助"
}

is_dm_service()
{
	dm_service_desc=`head -20 "$1" | grep "# service name"`
	if [ "x$dm_service_desc" = "x" ]
	then
		return 1
	fi

	is_dmamon_service=`echo "$dm_service_desc" | grep DmAuditMonitorService`
	is_dmjmon_service=`echo "$dm_service_desc" | grep DmJobMonitorService`
	is_dmimon_service=`echo "$dm_service_desc" | grep DmInstanceMonitorService`
	is_dmap_service=`echo "$dm_service_desc" | grep DmAPService`
	is_dmserver_service=`echo "$dm_service_desc" | grep DmService`
	is_dmwatcher_service=`echo "$dm_service_desc" | grep DmWatcherService`
	is_dmmonitor_service=`echo "$dm_service_desc" | grep DmMonitorService`
	is_dmcss_service=`echo "$dm_service_desc" | grep DmCSSService`
	is_dmcssm_service=`echo "$dm_service_desc" | grep DmCSSMonitorService`
	is_dmasmsvr_service=`echo "$dm_service_desc" | grep DmASMSvrService`
	is_dmasmsvrm_service=`echo "$dm_service_desc" | grep DmASMSvrmService`

	if [ "x$is_dmamon_service" = "x" -a "x$is_dmjmon_service" = "x" -a "x$is_dmimon_service" = "x" -a "x$is_dmap_service" = "x" -a "x$is_dmserver_service" = "x" -a "x$is_dmwatcher_service" = "x" -a "x$is_dmmonitor_service" = "x" -a "x$is_dmcss_service" = "x" -a "x$is_dmcssm_service" = "x" -a "x$is_dmasmsvr_service" = "x" -a "x$is_dmasmsvrm_service" = "x" ]
	then 
		return 1
	fi

	return 0
}

can_del_dm_service()
{
	if [ "x$is_dmamon_service" = "x" -a "x$is_dmjmon_service" = "x" -a "x$is_dmimon_service" = "x" -a "x$is_dmap_service" = "x" ]
	then 
		return 0
	fi

	return 1
}

# run by root

RUID=`/usr/bin/id|awk -F\( '{print $1}'|awk -F\= '{print $2}'`
if [ ${RUID} != "0" ]
then
	echo "必须以 root 身份执行此脚本"
	exit 1
fi

DEL_SERVICE_NAME=""
QUIET_DELETE=""

while getopts "n:hq" opt; do
	case $opt in
		n)
			DEL_SERVICE_NAME="$OPTARG"
			;;
		q)
			QUIET_DELETE="Y"
			;;
		h)
			show_help
			exit 0
			;;
		?)
			usage
			exit 1
			;;
		:)
			usage
			exit 1
			;;
	esac
done

#check opt
if [ "x$DEL_SERVICE_NAME" = "x" ]
then
	echo "指定删除的服务名不能空!"
	exit 1
fi

if [ "x$QUIET_DELETE" = "x" ]
then
	# confirm delete
	DEL_INFO_STR="是否删除服务($DEL_SERVICE_NAME)?(Y/y:是 N/n:否): "
	while :
	do
		echo $echonsign "$DEL_INFO_STR$echosnsign"
		read DEL_FLAG
		if [ "$DEL_FLAG" = "N" ] || [ "$DEL_FLAG" = "n" ]
		then
			exit 1
		elif [ "$DEL_FLAG" = "Y" ] || [ "$DEL_FLAG" = "y" ]
		then
			break
		else
			continue
		fi
	done
fi

DM_SERVICE_NAME="$DEL_SERVICE_NAME"
SYSTEMD_ETC_PATH="/etc/systemd/system"

IS_SYSTEMD="false"
systemctl --version>/dev/null 2>&1
RETURN_CODE="$?"
if [ "$RETURN_CODE" = "0" -a -d "$SYSTEMD_ETC_PATH" ]
then
	IS_SYSTEMD="true"
fi

if [ "$OS_NAME" = "Linux" -a "$IS_SYSTEMD" = "true" ]
then
	SYSTEMD_USER_PATH="/usr/lib/systemd/system"
	if [ ! -d "$SYSTEMD_USER_PATH" ]
	then
		SYSTEMD_USER_PATH="/lib/systemd/system"
	fi

	if [ ! -d "$SYSTEMD_USER_PATH" ]
	then
		echo "系统服务目录($SYSTEMD_USER_PATH)不存在!"
		exit 1
	fi

	SERVICE_FILE_PATH="$SYSTEMD_USER_PATH/$DM_SERVICE_NAME".service
	if [ ! -f "$SERVICE_FILE_PATH" ]
	then
		SERVICE_FILE_PATH="$SYSTEMD_ETC_PATH/$DM_SERVICE_NAME".service
		if [ ! -f "$SERVICE_FILE_PATH" ]
		then
			echo "未发现服务文件($SYSTEMD_USER_PATH/$DM_SERVICE_NAME.service或$SYSTEMD_ETC_PATH/$DM_SERVICE_NAME.service)!"
			exit 1
		fi
	fi

	is_dm_service "$DM_HOME/bin/$DM_SERVICE_NAME"
	if [ $? = 1 ]
	then
		echo "服务脚本文件($SERVICE_FILE_PATH)不是达梦服务脚本文件!"
		exit 1
	fi

	systemctl stop "$DM_SERVICE_NAME".service
	systemctl disable "$DM_SERVICE_NAME".service
	rm -f "$SERVICE_FILE_PATH"

	can_del_dm_service
	if [ $? -eq 0 ]
	then
		rm -f "$DM_HOME/bin/$DM_SERVICE_NAME"
	fi

	if [ ! -f "$SERVICE_FILE_PATH" ]
	then
		echo "删除服务文件($SERVICE_FILE_PATH)完成"
		echo "删除服务($DM_SERVICE_NAME)完成"
	fi
else
	# get the rc dir of system
	OS_INIT_D_DIR="/etc/rc.d/init.d"
	OS_RC_DIR="/etc/rc.d"
	if [ "$OS_NAME" = "Linux" ]
	then
		if [ -d "$OS_RC_DIR/rc0.d" ]
		then
			OS_INIT_D_DIR="/etc/rc.d/init.d"
			if [ ! -d "$OS_INIT_D_DIR" ]
			then
				OS_INIT_D_DIR="/etc/init.d"
			fi
			OS_RC_DIR="/etc/rc.d"
		else
			OS_INIT_D_DIR="/etc/init.d"
			OS_RC_DIR="/etc"
		fi
	elif [ "$OS_NAME" = "SunOS" ]
	then
		OS_INIT_D_DIR="/etc/init.d"
		OS_RC_DIR="/etc"
	elif [ "$OS_NAME" = "AIX" ]
	then
		OS_INIT_D_DIR="/etc/rc.d/init.d"
		OS_RC_DIR="/etc/rc.d"
	elif [ "$OS_NAME" = "HP-UX" ]
	then
		OS_INIT_D_DIR="/sbin/init.d"
		OS_RC_DIR="/sbin"
	elif [ "$OS_NAME" = "FreeBSD" ]
	then
		OS_INIT_D_DIR="/usr/local/etc/rc.d"
		OS_RC_LOCAL_FILE="/etc/rc.local"
	fi

	if [ ! -d "$OS_INIT_D_DIR" ]
	then
		echo "系统服务目录($OS_INIT_D_DIR)不存在!"
		exit 1
	fi

	if [ ! -f "$OS_INIT_D_DIR/$DM_SERVICE_NAME" ]
	then
		echo "未发现服务文件($OS_INIT_D_DIR/$DM_SERVICE_NAME)!"
		exit 1
	fi

	# delete service
	SERVICE_FILE_PATH="$OS_INIT_D_DIR/$DM_SERVICE_NAME"
	if [ -f "$SERVICE_FILE_PATH" ]
	then
		is_dm_service "$SERVICE_FILE_PATH"
		if [ $? = 1 ]
		then
			echo "服务脚本文件($SERVICE_FILE_PATH)不是达梦服务脚本文件!"
			exit 1
		fi

		"$SERVICE_FILE_PATH" stop

		if [ "x$is_dmasmsvr_service" != "x" -o "x$is_dmasmsvrm_service" != "x" ]
		then
			#level
			DEFAULT_LEVEL_K=04
			DEFAULT_LEVEL_S=96
			if [ "$OS_NAME" = "HP-UX" ]
			then
				DEFAULT_LEVEL_K=390
				DEFAULT_LEVEL_S=610
			fi
		elif [ "x$is_dmcss_service" != "x" ]
		then
			#level
			DEFAULT_LEVEL_K=06
			DEFAULT_LEVEL_S=94
			if [ "$OS_NAME" = "HP-UX" ]
			then
				DEFAULT_LEVEL_K=400
				DEFAULT_LEVEL_S=600
			fi
		else
			#level
			DEFAULT_LEVEL_K=02
			DEFAULT_LEVEL_S=98
			if [ "$OS_NAME" = "HP-UX" ]
			then
				DEFAULT_LEVEL_K=200
				DEFAULT_LEVEL_S=800
			fi
		fi

		if [ "$OS_NAME" = "Linux" -o "$OS_NAME" = "SunOS" -o "$OS_NAME" = "AIX" ]
		then
			if [ "$OS_NAME" = "Linux" ]
			then
				if [ ! -f "/sbin/chkconfig" ] && [ ! -f "/usr/sbin/update-rc.d" ]
				then
					echo "未发现chkconfig或update-rc.d可执行程序!"
					#confirm continue delete
					CONTINUE_DEL_INFO_STR="是否继续删除服务($DEL_SERVICE_NAME)?(Y/y:是 N/n:否):"
					while :
					do
						echo $echonsign "$CONTINUE_DEL_INFO_STR$echosnsign"
						read IGNORE_SERVICE_MGR
						if [ "$IGNORE_SERVICE_MGR" = "N" ] || [ "$IGNORE_SERVICE_MGR" = "n" ]
						then
							exit 1
						elif [ "$IGNORE_SERVICE_MGR" = "Y" ] || [ "$IGNORE_SERVICE_MGR" = "y" ]
						then
							break
						else
							continue
						fi
					done
				fi
			fi

			if [ -d  "$OS_RC_DIR/rc0.d" ]
			then
				rm -f "$OS_RC_DIR/rc0.d/K$DEFAULT_LEVEL_K$DM_SERVICE_NAME"
			fi
			if [ -d  "$OS_RC_DIR/rc1.d" ]
			then
				rm -f "$OS_RC_DIR/rc1.d/K$DEFAULT_LEVEL_K$DM_SERVICE_NAME"
			fi
			if [ -d  "$OS_RC_DIR/rc2.d" ]
			then
				rm -f "$OS_RC_DIR/rc2.d/S$DEFAULT_LEVEL_S$DM_SERVICE_NAME"
			fi
			if [ -d  "$OS_RC_DIR/rc3.d" ]
			then
				rm -f "$OS_RC_DIR/rc3.d/S$DEFAULT_LEVEL_S$DM_SERVICE_NAME"
			fi
			if [ -d  "$OS_RC_DIR/rc4.d" ]
			then
				rm -f "$OS_RC_DIR/rc4.d/S$DEFAULT_LEVEL_S$DM_SERVICE_NAME"
			fi
			if [ -d  "$OS_RC_DIR/rc5.d" ]
			then
				rm -f "$OS_RC_DIR/rc5.d/S$DEFAULT_LEVEL_S$DM_SERVICE_NAME"
			fi
			if [ -d  "$OS_RC_DIR/rc6.d" ]
			then
				rm -f "$OS_RC_DIR/rc6.d/K$DEFAULT_LEVEL_K$DM_SERVICE_NAME"
			fi

			if [ "$OS_NAME" = "Linux" ]
			then
				if [ -f "/sbin/chkconfig" ]
				then
					/sbin/chkconfig --del "$DM_SERVICE_NAME"
				else
					:
				fi
			fi
		elif [ "$OS_NAME" = "HP-UX" ]
		then
			rm -f "$OS_RC_DIR/rc0.d/K$DEFAULT_LEVEL_K$DM_SERVICE_NAME"
			rm -f "$OS_RC_DIR/rc1.d/S$DEFAULT_LEVEL_S$DM_SERVICE_NAME"
			rm -f "$OS_RC_DIR/rc2.d/S$DEFAULT_LEVEL_S$DM_SERVICE_NAME"
			rm -f "$OS_RC_DIR/rc3.d/K$DEFAULT_LEVEL_K$DM_SERVICE_NAME"
		elif [ "$OS_NAME" = "FreeBSD" ]
		then
			if [ ! -f "$OS_RC_LOCAL_FILE" ]
			then
				continue
			fi

			OLD_SERVICE_CONTENT=`cat "$OS_RC_LOCAL_FILE" | grep "^$DM_SERVICE_NAME""_enable="`
			if [ "x$OLD_SERVICE_CONTENT" = "x" ]
			then
				continue
			fi

			for ONE_OLD_SERVICE_CONTENT in "$OLD_SERVICE_CONTENT"
			do
				if [ "x$ONE_OLD_SERVICE_CONTENT" = "x" ]
				then
					continue
				fi

				cp "$OS_RC_LOCAL_FILE" "/tmp/rc.local_bak"
				cat "/tmp/rc.local_bak" | sed "s/$ONE_OLD_SERVICE_CONTENT//g" > "$OS_RC_LOCAL_FILE"
				rm -f "/tmp/rc.local_bak"
			done
		fi

		can_del_dm_service
		if [ $? -eq 0 ]
		then
			rm -f "$SERVICE_FILE_PATH"

		else
			mv "$SERVICE_FILE_PATH" "$DM_HOME/bin"

			OWNER_NAME=`ls -ld "$DM_HOME" | awk '{print $3}'`
			GROUP_NAME=`ls -ld "$DM_HOME" | awk '{print $4}'`

			chown $OWNER_NAME:$GROUP_NAME "$DM_HOME/bin/$DM_SERVICE_NAME"
		fi

		if [ ! -f "$SERVICE_FILE_PATH" ]
		then
			echo "删除服务文件($SERVICE_FILE_PATH)完成"
			echo "删除服务($DM_SERVICE_NAME)完成"
		fi
	fi
fi

exit 0

400行代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值