卸载redis7.2.4的shell脚本

保存文件: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 "$@"
相关推荐
Stack Overflow?Tan903 小时前
标注软件labelImg在linux下鼠标滚轮闪退解决办法
linux·labelimg
李彦亮老师(本人)3 小时前
Rocky Linux 9.x 新特性详解
linux·运维·服务器·centos·rocky linux
NiKick3 小时前
在Linux系统上使用nmcli命令配置各种网络(有线、无线、vlan、vxlan、路由、网桥等)
linux·服务器·网络
扛枪的书生6 小时前
包管理器用法速查
linux
BduL OWED6 小时前
Redis之Redis事务
java·数据库·redis
biubiubiu07066 小时前
Linux 中 `source` 和 `systemctl daemon-reload` 的区别与踩坑点
linux·运维·服务器
Lugas Luo6 小时前
SATA 硬盘识别延时:协议层与内核机制分析
linux·嵌入式硬件
lit_wei6 小时前
【Linux的以太网驱动的收发流程比较】
linux
ringking1237 小时前
Linux 主机通过 Wi-Fi 上网,并将网络通过网口共享给交换机下游设备
linux·服务器·网络
123过去7 小时前
rcracki_mt使用教程
linux·网络·测试工具