1.设计思路

redis经常需要去管理,而编译安装的redis没有启动脚本以及运维相关的脚本,我们可以自己设计一个

脚本需求:

1.可以启动、关闭、重启redis

启动:当redis没有运行的时候直接启动并输出启动成功,运行了就输出已经启动,避免重复进程

关闭:如果进程存在就关闭并输出已经关闭,没有进程则直接输出redis没有启动

重启:当进程存在就先执行关闭再启动,并输出重启成功,如果进程不存在直接执行启动

2.可以查看redis进程

3.可以登录redis

4.可以查看redis日志

5.由于redis是多端口实例,因此需要能够实现指定一个端口就能够启动这个端口的进程

实现思路

1.将所有的功能都做成函数

2.通过判断$1输入的是什么指令,并执行对应的脚本

2.编写脚本

2.1.定义各种变量

将redis部署路径、端口号、配置文件、主机IP都定义成变量

  1. redis\_port=$2 #redis端口 redis\_name="redis\_${redis\_port}" #redis节点所在目录名称,即redis\_6379 redis\_home=/data/redis\_cluster/${redis\_name} #redis节点所在万年竹路径 redis\_conf=${redis\_home}/conf/${redis\_name}.conf #redis配置文件路径 redis\_host=\`ifconfig ens33 | awk 'NR==2{print $2}'\` #主机ip redis\_pass=$3 #redis密码,用到了在登陆那边加个-a参数 red="\\e\[031m" green="\\e\[032m" yellow="\\e\[033m" black="\\e\[0m"

2.2.编写使用模块

主要实现如何使用这个脚本

Usage(){  echo "usage: sh $0 {start|stop|restart|login|ps|logs|-h} PORT" }

2.3.编写启动模块

思路:首先判断指定端口的redis是否存在,如果不存在就执行启动命令,启动后输出启动成功,然后将开启的端口列出来

这里还需要判断一下state的值是不是空的,因为到重启模块需要判断,在重启模块会定义一个state值,这里检测到state的值为空就输出echo的内容,到了restart的时候如果进程一开始是没有的无需输出echo内容,主要是为了重启的时候不输出这些echo

启动后echo的时候,也会判断state的值,如果不为空就表示是重启了,就提示重启成功

Start(){  redis\_cz=\`netstat -lnpt | grep redis | grep "${redis\_port}" | wc -l\` if \[ $redis\_cz -eq 0 \];then redis-server ${redis\_conf} if \[ -z $state \];then echo -e "${green}redis ${redis\_port}实例启动成功!${black}" else echo -e "${green}redis ${redis\_port}实例重启成功!${black}" fi netstat -lnpt | grep ${redis\_port} else if \[ -z $state \];then echo -e "${yellow}redis "${redis\_port}"实例已经是启动状态!${black}" netstat -lnpt | grep ${redis\_port} fi fi }

2.4.编写关闭模块

思路:首先判断进程是否存在,如果存在就执行关闭命令,不存在就直接输出没有启动

这里还需要判断一下state的值是不是空的,因为到重启模块需要判断,在重启模块会定义一个state值,这里检测到state的值为空就输出echo的内容,到了restart的时候如果进程一开始是没有的无需输出echo内容,主要是为了重启的时候不输出这些echo

Stop(){  redis\_cz=\`netstat -lnpt | grep redis | grep "${redis\_port}" | wc -l\` if \[ $redis\_cz -gt 0 \];then redis-cli -h $redis\_host -p $redis\_port shutdown if \[ -z $state \];then echo -e "${green}redis ${redis\_port}实例关闭成功!" fi else if \[ -z $state \];then echo -e "${red}redis "${redis\_port}"实例没有启动!${black}" fi fi }

2.5.编写重启模块

思路:重启模块直接调用Stop模块和Start模块即可

重启模块一开始要增加一个state的变量,当执行stop模块的时候就去判断state的值,如果不为空即使是没有进程也不需要输出stop模块的echo命令,直接执行start,属于跳过某个命令的实现吧

Restart(){  state=restart Stop Start }

2.7.编写登陆模块

思路:首先判断redis有没有启动,如果没有启动就询问是否启动,按y启动,按n就退出

Login(){  redis\_cz=\`netstat -lnpt | grep redis | grep "${redis\_port}" | wc -l\` if \[ $redis\_cz -gt 0 \];then redis-cli -h $redis\_host -p $redis\_port else echo -e "${red}redis ${redis\_port}实例没有启动!${black}" echo -en  "${yellow}是否要启动reis? \[y/n\]${black}" read action case $action in y|Y) Start Login ;; n|N) exit 1 ;; esac fi }

2.8.编写查看进程模块

思路:直接用ps查即可

Ps(){  ps aux | grep redis }

2.9.编写查看日志模块

思路:配合各种变量去找到指令路径的日志即可

Logs(){  tail -f ${redis\_home}/logs/${redis\_name}.log }

2.10编写帮助信息模块

思路:通过echo输出提示信息

Help(){  Usage echo "+-------------------------------------------------------------------------------+" echo "| start           启动redis                                                       |" echo "| stop            关闭redis                                                       |" echo "| restart 重启redis                                                       |" echo "| login           登陆redis                                                       |" echo "| ps              查看redis的进程信息,不需要加端口号                              |" echo "| logs            查看redis日志持续输出                                           |" echo "| 除ps命令外,所有命令后面都需要加端口号                                           |" echo "+-------------------------------------------------------------------------------+" }

2.11编写判断脚本参数模块

思路:判断脚本的参数是否不等于2,如果传入的参数不是两个的时候(因为很多模块都需要传入指令和端口这俩参数),再判断$1传入的值是不是ps和-h,因为ps和-h只需要一个参数即可,如果不是ps和-h,那么久输出使用方法,然后退出脚本

if \[ $# -ne 2 \];then  if \[ "$1" != "ps" \] &&  \[ "$1" != "-h" \];then Usage exit 1 fi fi

2.12编写指令判断模块

思路:通过case实现,根据不同的指令执行不同的函数

case $1 in start)  Start ;; stop)  Stop ;; restart)  Restart ;; login)  Login ;; ps)  Ps ;; logs)  Logs ;; \-h)  Help ;; \*)  Help ;; esac

3.整合脚本内容

#!/bin/bash #redis控制脚本 redis\_port=$2 redis\_name="redis\_${redis\_port}" redis\_home=/data/redis\_cluster/${redis\_name} redis\_conf=${redis\_home}/conf/${redis\_name}.conf redis\_host=\`ifconfig ens33 | awk 'NR==2{print $2}'\` redis\_pass=$3 red="\\e\[031m" green="\\e\[032m" yellow="\\e\[033m" black="\\e\[0m"   Usage(){  echo "usage: sh $0 {start|stop|restart|login|ps|logs|-h} PORT" }   Start(){  redis\_cz=\`netstat -lnpt | grep redis | grep "${redis\_port}" | wc -l\` if \[ $redis\_cz -eq 0 \];then redis-server ${redis\_conf} if \[ -z $state \];then echo -e "${green}redis ${redis\_port}实例启动成功!${black}" else echo -e "${green}redis ${redis\_port}实例重启成功!${black}" fi netstat -lnpt | grep ${redis\_port} else if \[ -z $state \];then echo -e "${yellow}redis "${redis\_port}"实例已经是启动状态!${black}" netstat -lnpt | grep ${redis\_port} fi fi }   Stop(){  redis\_cz=\`netstat -lnpt | grep redis | grep "${redis\_port}" | wc -l\` if \[ $redis\_cz -gt 0 \];then redis-cli -h $redis\_host -p $redis\_port shutdown if \[ -z $state \];then echo -e "${green}redis ${redis\_port}实例关闭成功!" fi else if \[ -z $state \];then echo -e "${red}redis "${redis\_port}"实例没有启动!${black}" fi fi }   Restart(){  state=restart Stop Start }   Login(){  redis\_cz=\`netstat -lnpt | grep redis | grep "${redis\_port}" | wc -l\` if \[ $redis\_cz -gt 0 \];then redis-cli -h $redis\_host -p $redis\_port else echo -e "${red}redis ${redis\_port}实例没有启动!${black}" echo -en  "${yellow}是否要启动reis? \[y/n\]${black}" read action case $action in y|Y) Start Login ;; n|N) exit 1 ;; esac fi }   Ps(){  ps aux | grep redis }   Logs(){  tail -f ${redis\_home}/logs/${redis\_name}.log }   Help(){  Usage echo "+-------------------------------------------------------------------------------+" echo "| start   启动redis             |" echo "| stop    关闭redis             |" echo "| restart 重启redis             |" echo "| login   登陆redis             |" echo "| ps    查看redis的进程信息,不需要加端口号        |" echo "| logs    查看redis日志持续输出           |" echo "| 除ps命令外,所有命令后面都需要加端口号            |" echo "+-------------------------------------------------------------------------------+" }   if \[ $# -ne 2 \];then  if \[ "$1" != "ps" \] &&  \[ "$1" != "-h" \];then Usage exit 1 fi fi     case $1 in start)  Start ;; stop)  Stop ;; restart)  Restart ;; login)  Login ;; ps)  Ps ;; logs)  Logs ;; \-h)  Help ;; \*)  Help ;; esac

4.使用redis运维脚本

4.1.查看帮助信息

\[root@redis-1 ~\]# sh redis\_shell.sh  -h usage: sh redis\_shell.sh {start|stop|restart|login|ps|logs|-h} PORT +-------------------------------------------------------------------------------+ | start   启动redis                                | | stop    关闭redis                                | | restart 重启redis                                | | login   登陆redis                                  | | ps    查看redis的进程信息,不需要加端口号                     | | logs    查看redis日志持续输出                          | | 除ps命令外,所有命令后面都需要加端口号                                     | +-------------------------------------------------------------------------------+

4.2.启动redis

第一次启动会提示启动成功,第二次在启动提示已经启动

\[root@redis-1 ~\]# sh redis\_shell.sh start 6379 redis 6379实例启动成功! tcp        0      0 127.0.0.1:6379          0.0.0.0:\*               LISTEN      101765/redis-server tcp        0      0 192.168.81.210:6379     0.0.0.0:\*               LISTEN      101765/redis-server     \[root@redis-1 ~\]# sh redis\_shell.sh start 6379 redis 6379实例已经是启动状态! tcp        0      0 127.0.0.1:6379          0.0.0.0:\*               LISTEN      101765/redis-server tcp        0      0 192.168.81.210:6379     0.0.0.0:\*               LISTEN      101765/redis-server \[root@redis-1 ~\]#

4.3.关闭redis

\[root@redis-1 ~\]# sh redis\_shell.sh stop 6379 redis 6379实例关闭成功! \[root@redis-1 ~\]# \[root@redis-1 ~\]# sh redis\_shell.sh stop 6379 redis 6379实例没有启动!

4.4.重启redis

\[root@redis-1 ~\]# sh redis\_shell.sh restart 6379 redis 6379实例重启成功! tcp        0      0 127.0.0.1:6379          0.0.0.0:\*               LISTEN      102654/redis-server tcp        0      0 192.168.81.210:6379     0.0.0.0:\*               LISTEN      102654/redis-server

4.5.登陆redis

启动了redis进行登陆

\[root@redis-1 ~\]# sh redis\_shell.sh login 6379 192.168.81.210:6379> DBSIZE (integer) 0

没有启动redis进行登陆,首先询问是否启动,启动即可进入,不启动就退出

\[root@redis-1 ~\]# sh redis\_shell.sh login 6379 redis 6379实例没有启动! 是否要启动reis? \[y/n\]y redis 6379实例启动成功! tcp        0      0 127.0.0.1:6379          0.0.0.0:\*               LISTEN      - tcp        0      0 192.168.81.210:6379     0.0.0.0:\*               LISTEN      - 192.168.81.210:6379> DBSIZE (integer) 0 192.168.81.210:6379> exit   \[root@redis-1 ~\]# sh redis\_shell.sh stop 6379 redis 6379实例关闭成功!   \[root@redis-1 ~\]# sh redis\_shell.sh login 6379 redis 6379实例没有启动! 是否要启动reis? \[y/n\]n

4.6.查看进程

无需跟端口号

\[root@redis-1 ~\]# sh redis\_shell.sh ps avahi      6935  0.0  0.1  62272  2296 ?        Ss   1月29   0:04 avahi-daemon: running \[redis-1.local\] root      79457  0.1  0.4 136972  7720 ?        Ssl  2月01   1:43 redis-server 192.168.81.210:6380 \[cluster\] root      79461  0.1  0.4 136972  7688 ?        Ssl  2月01   1:44 redis-server 192.168.81.210:6381 \[cluster\] root     101261  0.0  0.3 151888  5648 pts/2    S+   13:10   0:01 vim redis\_shell.sh root     102767  0.0  0.0 113176  1412 pts/0    S+   13:51   0:00 sh redis\_shell.sh ps root     102772  0.0  0.0 112728   968 pts/0    R+   13:51   0:00 grep redis

4.7.查看日志

持续输出日志信息

\[root@redis-1 ~\]# sh redis\_shell.sh logs 6379

Redis运维脚本(十二)-阿里云开发者社区 - 图1