卸载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 "$@"
相关推荐
不会写程序的未来程序员1 小时前
Redis 哨兵(Sentinel)原理
数据库·redis·sentinel
徐子元竟然被占了!!1 小时前
Linux-vim
linux·运维·vim
有什么东东1 小时前
redis实现店铺类型查看
java·开发语言·redis
SDAU20051 小时前
ESP32C3在Arduino下的MQTT操作
linux·服务器·前端
梁正雄1 小时前
linux服务-RabbitMQ 原理与安装
linux·rabbitmq·ruby
骇客野人1 小时前
Java @Mapper 使用注解的方式注入SQL
linux·服务器·windows
Lisonseekpan1 小时前
技术选型分析:MySQL、Redis、MongoDB、ElasticSearch与大数据怎么选?
大数据·redis·后端·mysql·mongodb·elasticsearch
hazhanglvfang1 小时前
liunx基础环境排查
linux·运维·服务器
乌萨奇也要立志学C++1 小时前
【Linux】线程控制 POSIX 线程库详解与 C++ 线程库封装实践
linux·c++