保存文件:uninstall_redis.sh
执行:chmod +x uninstall_redis.sh
执行:./uninstall_redis.sh
bash
#!/bin/bash
# Redis自动化卸载脚本 for CentOS 7
# 日期:$(date +%Y-%m-%d)
set -e # 遇到错误时退出脚本
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 日志函数
log_info() {
echo -e "${GREEN}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
log_step() {
echo -e "${BLUE}[STEP]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
# 检查是否以root用户运行
check_root() {
if [[ $EUID -ne 0 ]]; then
log_error "此脚本必须以root用户运行"
fi
}
# 配置参数(与安装脚本一致)
REDIS_VERSION="7.2.4"
INSTALL_DIR="/usr/local/redis"
CONF_DIR="${INSTALL_DIR}/etc"
LOG_DIR="/var/log/redis"
DATA_DIR="/var/lib/redis"
TMP_DIR="/tmp/redis_build"
REDIS_USER="redis"
REDIS_GROUP="redis"
REDIS_PORT="6379"
# 停止并禁用Redis服务
stop_redis_service() {
log_step "停止并禁用Redis服务..."
# 停止服务
if systemctl is-active --quiet redis; then
systemctl stop redis
log_info "Redis服务已停止"
else
log_info "Redis服务未运行"
fi
# 禁用开机自启
if systemctl is-enabled --quiet redis; then
systemctl disable redis
log_info "Redis开机自启已禁用"
else
log_info "Redis开机自启已禁用"
fi
# 重新加载systemd
systemctl daemon-reload
}
# 删除systemd服务文件
remove_systemd_service() {
log_step "删除systemd服务文件..."
# 删除服务文件
if [ -f "/etc/systemd/system/redis.service" ]; then
rm -f /etc/systemd/system/redis.service
log_info "已删除 /etc/systemd/system/redis.service"
else
log_info "服务文件不存在"
fi
# 重新加载systemd
systemctl daemon-reload
}
# 删除Redis安装目录
remove_redis_installation() {
log_step "删除Redis安装目录..."
if [ -d "${INSTALL_DIR}" ]; then
rm -rf ${INSTALL_DIR}
log_info "已删除安装目录: ${INSTALL_DIR}"
else
log_info "安装目录不存在: ${INSTALL_DIR}"
fi
}
# 删除日志目录
remove_log_directory() {
log_step "删除Redis日志目录..."
if [ -d "${LOG_DIR}" ]; then
rm -rf ${LOG_DIR}
log_info "已删除日志目录: ${LOG_DIR}"
else
log_info "日志目录不存在: ${LOG_DIR}"
fi
}
# 删除数据目录
remove_data_directory() {
log_step "删除Redis数据目录..."
if [ -d "${DATA_DIR}" ]; then
rm -rf ${DATA_DIR}
log_info "已删除数据目录: ${DATA_DIR}"
else
log_info "数据目录不存在: ${DATA_DIR}"
fi
}
# 删除临时目录
remove_temp_directory() {
log_step "删除临时目录..."
if [ -d "${TMP_DIR}" ]; then
rm -rf ${TMP_DIR}
log_info "已删除临时目录: ${TMP_DIR}"
else
log_info "临时目录不存在: ${TMP_DIR}"
fi
}
# 删除运行时PID文件
remove_pid_files() {
log_step "删除运行时PID文件..."
# 删除PID文件
if [ -f "/var/run/redis_${REDIS_PORT}.pid" ]; then
rm -f /var/run/redis_${REDIS_PORT}.pid
log_info "已删除PID文件: /var/run/redis_${REDIS_PORT}.pid"
else
log_info "PID文件不存在: /var/run/redis_${REDIS_PORT}.pid"
fi
}
# 删除用户和组
remove_redis_user_group() {
log_step "删除Redis用户和组..."
# 删除用户
if id -u ${REDIS_USER} >/dev/null 2>&1; then
userdel ${REDIS_USER}
log_info "已删除用户: ${REDIS_USER}"
else
log_info "用户不存在: ${REDIS_USER}"
fi
# 删除组
if getent group ${REDIS_GROUP} >/dev/null 2>&1; then
groupdel ${REDIS_GROUP}
log_info "已删除组: ${REDIS_GROUP}"
else
log_info "组不存在: ${REDIS_GROUP}"
fi
}
# 清理防火墙配置
cleanup_firewall() {
log_step "清理防火墙配置..."
if systemctl is-active --quiet firewalld; then
log_info "防火墙正在运行,移除Redis端口规则..."
firewall-cmd --permanent --remove-port=${REDIS_PORT}/tcp 2>/dev/null || true
firewall-cmd --reload 2>/dev/null || true
log_info "防火墙规则已移除 (端口: ${REDIS_PORT})"
else
log_info "防火墙未运行,跳过配置清理"
fi
}
# 清理系统配置
cleanup_system_config() {
log_step "清理系统配置..."
# 清理rc.local中的Redis优化配置
if grep -q "# Redis优化" /etc/rc.local; then
sed -i '/# Redis优化 - 禁用透明大页/,+4d' /etc/rc.local
log_info "已清理rc.local中的Redis配置"
else
log_info "rc.local中无Redis配置"
fi
# 清理sysctl.conf中的Redis配置
if grep -q "# Redis优化参数" /etc/sysctl.conf; then
sed -i '/# Redis优化参数/,+5d' /etc/sysctl.conf
# 应用内核参数
sysctl -p 2>/dev/null || true
log_info "已清理sysctl.conf中的Redis配置"
else
log_info "sysctl.conf中无Redis配置"
fi
# 清理limits.conf中的Redis配置
if grep -q "# Redis文件描述符限制" /etc/security/limits.conf; then
sed -i '/# Redis文件描述符限制/,+4d' /etc/security/limits.conf
log_info "已清理limits.conf中的Redis配置"
else
log_info "limits.conf中无Redis配置"
fi
}
# 主函数
main() {
log_step "开始卸载Redis ${REDIS_VERSION}"
echo -e "${YELLOW}警告: 此操作将完全删除Redis及其所有相关文件和配置!${NC}"
echo -n "确认继续吗? (输入 'yes' 确认): "
read confirmation
if [ "$confirmation" != "yes" ]; then
log_info "取消卸载操作"
exit 0
fi
# 执行卸载步骤
check_root
stop_redis_service
remove_systemd_service
remove_redis_installation
remove_log_directory
remove_data_directory
remove_temp_directory
remove_pid_files
remove_redis_user_group
cleanup_firewall
cleanup_system_config
log_step "==================== Redis卸载完成 ===================="
echo "Redis ${REDIS_VERSION} 已成功卸载!"
echo "以下项目已被删除:"
echo " - Redis安装目录: ${INSTALL_DIR}"
echo " - Redis日志目录: ${LOG_DIR}"
echo " - Redis数据目录: ${DATA_DIR}"
echo " - Redis临时目录: ${TMP_DIR}"
echo " - Redis PID文件: /var/run/redis_${REDIS_PORT}.pid"
echo " - Redis用户和组: ${REDIS_USER}:${REDIS_GROUP}"
echo " - systemd服务: /etc/systemd/system/redis.service"
echo " - 防火墙规则: 端口 ${REDIS_PORT}"
echo ""
echo "注意: 系统级别的依赖包未被删除,如需删除请手动处理"
log_step "====================================================="
}
# 执行主函数
main "$@"