Ubuntu 20.x Redis启动脚本

之前一直都是用 Centos ,最近转到 Ubuntu 后, Redis 启动脚本有部分变化
此处记录下,也方便需要的小伙伴参考使用

Centos 版本请参考: Centos7.9 源码安装Redis 5.x

脚本效果如下

在这里插入图片描述

Ubuntu 适配后,脚本内容

#!/bin/sh
 
# Redis 启动脚本
# 
# @author: hal@xhal.net 2022-11-16
#          2024-05-30 修改适配 Ubuntu 20.x 系统
 
# 脚本当前目录
#SH_DIR=$(cd $( dirname ${BASH_SOURCE[0] } ) && pwd)
cd $(dirname $0)
SH_DIR=$(pwd)

APP_NAME="redis-server"
# 根路径
#APP_PATH=/usr/local/redis
APP_PATH=$SH_DIR
BIN_PATH=$APP_PATH/bin
# 配置文件路径
CONF_PATH=$APP_PATH/conf
CONF_FILE_PATH=$CONF_PATH/redis.conf
MASTER_CONF_FILE_PATH=$CONF_PATH/master.conf
SLAVE_CONF_FILE_PATH=$CONF_PATH/slave.conf
 
# 运行端口 - 默认 6379
APP_PORT=6379
# Redis 密码 - 默认为空
APP_PASS=""
 
## 从配置文件,读取端口、密码
CONFIG_STR=$(cat $CONF_FILE_PATH | grep -E '^port|^requirepass')
#echo "CONFIG_STR: $CONFIG_STR"
PORT_STR=$(echo $CONFIG_STR | sed 's/port \([0-9]*\).*/\1/g' )
PASS_STR=$(echo -e $CONFIG_STR | sed 's/.*requirepass \(.*\)/\1/g' | sed 's/"//g')
 
#echo "PORT_STR: $PORT_STR"
#echo "PASS_STR: $PASS_STR"
if [ -n "$PORT_STR" ]; then
  APP_PORT=$PORT_STR;
fi
if [ -n "$PASS_STR" ]; then
  APP_PASS=$PASS_STR;
fi
 
# 处理密码连接字符串
PASS_KEY=""
if [ -n "$APP_PASS" ]; then
  PASS_KEY="-a $APP_PASS"
fi
echo -e "\e[35m======================================================================\e[0m"
 
#使用说明 用来提示参数
usage(){
  echo -e "\e[33mAPP_PATH:\e[0m \e[36m $APP_PATH \e[0m"
  echo -e "\e[33mUsage:\e[0m    \e[36m $0 [start|stop|restart] \e[0m"
  echo -e "\e[33mUsage:\e[0m    \e[36m $0 [status|running|role|slaveup] \e[0m"
  echo -e "\e[33mUsage:\e[0m    \e[36m $0 [tomaster|toslave|startmaster|startslave|startauto] \e[0m"
  echo -e "\e[35m----------------------------------------------------------------------\e[0m"
  echo -e " -\e[32m start   \e[0m: 正常启动 Redis,$BIN_PATH/redis-server $CONF_FILE_PATH"
  echo -e " -\e[32m stop    \e[0m: 停止 Redis, $BIN_PATH/redis-cli shutdown"
  echo -e " -\e[32m restart \e[0m: 重启 Redis, stop && start"
  echo -e "\e[35m----------------------------------------------------------------------\e[0m"
  echo -e " -\e[32m status  \e[0m: 当前运行状态、对应角色类型"
  echo -e " -\e[32m running \e[0m: 当前运行状态,运行中返回 0,否则返回 1"
  echo -e " -\e[32m role    \e[0m: 当前运行对应角色类型,master 返回 0, slave 返回 1, 其它 返回2, redis 未运行 返回9"
  echo -e " -\e[32m slaveup \e[0m: 当前运行状态为slave时,master_link_status是否为up (是则返回0,否则为1)"
  echo -e "\e[35m----------------------------------------------------------------------\e[0m"
  echo -e " -\e[32m tomaster   \e[0m: 运行状态转换角色类型为【master】"
  echo -e " -\e[32m toslave    \e[0m: 运行状态转换角色类型为【slave】"
  echo -e " -\e[32m startmaster\e[0m: 未运行时,以【master】角色类型运行"
  echo -e " -\e[32m startslave \e[0m: 未运行时,以【slave】角色类型运行"
  echo -e " -\e[32m startauto  \e[0m: 未运行时,根据slave.conf的master节点状态,自动判断当前节点以【master/slave】角色类型运行"
  echo ""
  exit 1
}
 
#检查程序是否已运行
is_running(){
  # 根据应用名称,获取进程pid (当存在多个时不适用)
  #pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}'`
 
  # 根据端口号获取对应 pid
  #pid=$(lsof -t -i:$APP_PORT)
  pid=$(lsof -i:$APP_PORT | grep *: | awk '{print $2}')
  #如果不存在返回1 存在返回0
  if [ -z "${pid}" ]; then
   return 1
  else
   return 0
  fi
}
 
# 启动方法 
start(){
  is_running
  if [ $? -eq "0" ]; then
    echo "$APP_NAME - [PORT: $APP_PORT] is already running . pid=${pid}"
  else 
    $BIN_PATH/redis-server $CONF_FILE_PATH
    sleep 1
    status
    if [ $? -eq "0" ]; then
      echo "$APP_NAME - [PORT: $APP_PORT] start success . pid=${pid}"
    else 
      echo "$APP_NAME - [PORT: $APP_PORT] start fail ."
    fi
  fi
}
 
# 用 master.conf 的配置文件替换 redis.conf 后启动
startmaster(){
  echo "准备以【 master 】模式启动,复制替换 redis.conf 文件..."
  cp -f $MASTER_CONF_FILE_PATH $CONF_FILE_PATH
  sleep 1
  start  
}
 
# 用 slave.conf 的配置文件替换 redis.conf 后启动
startslave(){
  echo "准备以【 slave 】模式启动,复制替换 redis.conf 文件..."
  cp -f $SLAVE_CONF_FILE_PATH $CONF_FILE_PATH
  sleep 1
  start
}
 
# 自动判断当前启用 master 还是 slave 模式
startauto(){
  is_running
  if [ $? -eq "0" ]; then
    echo "$APP_NAME - [PORT: $APP_PORT] is already running . pid=${pid}"
    exit 1
  fi
 
  # 读取 slave.conf 配置,获取对应 master 配置
  arr=$(cat $SLAVE_CONF_FILE_PATH | grep ^replicaof)
  master_host=${arr[1]}
  master_port=${arr[2]}
  authcmd=$(cat $SLAVE_CONF_FILE_PATH | grep ^masterauth | sed 's/masterauth //g' | sed 's/"//g')
  auth_key=""
  
  if [ -n "$authcmd" ]; then
    auth_key="-a $authcmd"
  fi
  echo "设置 master -h $master_host -p $master_port $auth_key "
  # 判断 master 配置中的服务,对应角色类型
  roleName=$($BIN_PATH/redis-cli -h $master_host -p $master_port $auth_key info | grep role: | sed 's/.$//g')
  
  echo "slave 配置的 master 当前类型: $roleName"
  if [ "$roleName" = "role:master" ]; then
    startslave
  else 
    startmaster
  fi
}
 
# 停止方法
stop(){
  is_running
  if [ $? -eq "0" ]; then
    echo "$APP_NAME - [PORT: $APP_PORT] is running . pid=${pid} ; stoping..."
    # 执行 shutdown
    $BIN_PATH/redis-cli $PASS_KEY shutdown
    
    sleep 1
    is_running
    if [ $? -eq "0" ]; then
      echo "$APP_NAME - [PORT: $APP_PORT] stop fail . pid=${pid}"
    else
      echo "$APP_NAME - [PORT: $APP_PORT] stop success ."
    fi    
  else 
    echo "$APP_NAME - [PORT: $APP_PORT] is not running ."
  fi
}
 
#重启
restart(){
  stop
  start
}
 
# 判断运行的角色[ master, slave ]
# master 返回 0, slave 返回 1, 其它 返回2, redis 未运行 返回9
role(){
  is_running
  if [ $? -eq "0" ]; then
    roleName=$($BIN_PATH/redis-cli $PASS_KEY info | grep role: | sed 's/.$//g')
    if [ "$roleName" = "role:master" ]; then
      return 0
    elif [ "$roleName" = "role:slave" ]; then
      return 1
    else
      #echo "ERROR: unknow role: [$roleName] !!!"
      return 2
    fi
  else 
    #echo "$APP_NAME - [PORT: $APP_PORT] is not running ."
    return 9
  fi
}
 
# 判断当前运行的 是否为 slave 且 正常连接上 master
# 为简化逻辑,此处实现仅 在 info 信息中匹配 master_link_status:up (运行正常返回0,否则为1)
# 即正常调用前,应该要知道此节点正常运行 且 为 slave
slaveup(){
  linkStatus=$($BIN_PATH/redis-cli $PASS_KEY info | grep master_link_status:up)
  if [ -z "$linkStatus" ]; then
   #echo "redis master link is down"
   return 1
  else 
   #echo "redis master link is up"
   return 0
  fi
}
 
# Change Redis to master; Use Command:  replicaof no one 
tomaster(){
  role
  mode=$?
  if [ $mode -eq "0" ]; then
    echo "$APP_NAME - [PORT: $APP_PORT] 已经是[ master ] 不必要切换 ."
  elif [ $mode -eq "1" ]; then
    # 切换配置文件 - 避免下次重启后变化
    cp -f $MASTER_CONF_FILE_PATH $CONF_FILE_PATH
    # 执行切换为 主服务
    $BIN_PATH/redis-cli $PASS_KEY replicaof no one
    sleep 1
    status
  else 
    echo "$APP_NAME - [PORT: $APP_PORT] 不支持操作状态 [$mode]."
  fi
}
 
# Change Redis to slave; Use Command:  replicaof masterip masterport
toslave(){
  role
  mode=$?
  if [ $mode -eq "1" ]; then
    echo "$APP_NAME - [PORT: $APP_PORT] 已经是[ slave ] 不必要切换 ."
  elif [ $mode -eq "0" ]; then
    # 切换配置文件 - 避免下次重启后变化
    cp -f $SLAVE_CONF_FILE_PATH $CONF_FILE_PATH
    
    authcmd=$(cat $CONF_FILE_PATH | grep ^masterauth | sed 's/"//g')
    echo "设置 master 连接密码. $authcmd"
    # 执行更新密码
    $BIN_PATH/redis-cli $PASS_KEY config set $authcmd
 
    repcmd=$(cat $CONF_FILE_PATH | grep ^replicaof)
    echo "准备切换为[ slave ], $repcmd"
    # 执行切换为 从服务
    $BIN_PATH/redis-cli $PASS_KEY $repcmd
    
    sleep 1
    status
  else
    echo "$APP_NAME - [PORT: $APP_PORT] 不支持操作状态 [$mode]."
  fi
}
 
# 判断状态
status(){
  is_running
  if [ $? -eq "0" ]; then
    echo "$APP_NAME - [PORT: $APP_PORT] is running . pid=${pid}"
    role
    if [ $? -eq "0" ]; then
      echo "Redis is master role"
    elif [ $? -eq "1" ]; then
      echo "Redis is slave role"
    else 
      echo "Redis is unknow role"
    fi
  else 
    echo "$APP_NAME - [PORT: $APP_PORT] is not running ."
  fi
}
 
# 根据输入的参数执行对应的方法
case "$1" in
  "start")
    start
    ;;
  "stop")
    stop
    ;;
  "running")
    is_running
    ;;
  "status")
    status
    ;;
  "role")
    role
    ;;
  "restart")
    restart
    ;;
  "tomaster")
    tomaster
    ;;
  "toslave")
    toslave
    ;;
  "startmaster")
    startmaster
    ;;
  "startslave")
    startslave
    ;;
  "startauto")
    startauto
    ;;
  "slaveup")
    slaveup
    ;;
  *)
    usage
    ;;
esac

### 如何在 Ubuntu 22.04 上安装和运行 Redis #### 更新包管理器索引 为了确保系统能够获取最新的软件版本,在开始之前需要更新 APT 包管理器的索引。可以通过以下命令实现: ```bash sudo apt update ``` #### 安装 Redis 接着,使用 `apt` 命令来安装 Redis 服务器: ```bash sudo apt install redis-server -y ``` 这一步会自动处理所有必要的依赖项,并完成 Redis 的基本安装[^1]。 #### 验证 Redis 运行状态 安装完成后,可以确认 Redis 是否正常启动以及其当前的状态。通过以下命令检查 Redis 服务的状态: ```bash sudo systemctl status redis-server ``` 如果一切正常,输出应显示 Redis 正处于活动(active)状态,并准备好接受连接[^4]。 #### 自动化安装脚本 对于希望简化流程或者批量部署的情况,可以利用自动脚本来执行上述操作。下面是一个经过验证的 Bash 脚本示例: ```bash #!/bin/bash # 检查 Redis 是否已安装 if dpkg -l | grep -q redis-server; then echo "Redis 已经安装" else echo "Redis 尚未安装,正在进行安装..." # 更新包列表 sudo apt-get update # 修复可能存在的破损依赖关系 sudo apt --fix-broken install -y # 安装 Redis sudo apt-get install -y redis-server # 启动 Redis 服务 sudo service redis-server start fi # 设置密码选项 read -p "是否需要为 Redis 设置密码?(y/n): " SET_PASSWORD if [ "$SET_PASSWORD" == "y" ]; then read -sp "请输入 Redis 密码: " REDIS_PASSWORD echo "" # 修改配置文件以用密码保护 sudo sed -i '/^requirepass /d' /etc/redis/redis.conf echo "requirepass $REDIS_PASSWORD" | sudo tee -a /etc/redis/redis.conf fi # 开远程访问支持 sudo sed -i 's/^bind 127.0.0.1 ::1/# bind 127.0.0.1 ::1/' /etc/redis/redis.conf sudo sed -i 's/^protected-mode yes/protected-mode no/' /etc/redis/redis.conf # 重 Redis 服务使更改生效 sudo service redis-server restart echo "Redis 安装与配置已完成" # 查看 Redis 当前的服务状态 sudo service redis-server status ``` 此脚本不仅实现了基础功能,还提供了额外的功能扩展,比如设置密码和允许远程访问[^3]。 #### 测试 Redis 功能 最后,测试 Redis 是否能正常使用非常重要。打开终端并键入以下命令进入交互模式: ```bash redis-cli ``` 一旦进入客户端界面,尝试简单的指令如 `ping` 来检验响应情况。预期的结果应该是返回字符串 `PONG` 表明通信无误[^4]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值