Redis运维脚本(十二)

举报
jiangxl 发表于 2022/04/01 00:03:00 2022/04/01
【摘要】 redis运维脚本 1.设计思路 redis经常需要去管理,而编译安装的redis没有启动脚本以及运维相关的脚本,我们可以自己设计一个 脚本需求: ​ 1.可以启动、关闭、重启redis ​ 启...

redis运维脚本

1.设计思路

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

脚本需求:

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

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

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

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

​ 2.可以查看redis进程

​ 3.可以登录redis

​ 4.可以查看redis日志

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

实现思路:

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

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

2.编写脚本

2.1.定义各种变量

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

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"


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2.2.编写使用模块

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

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

  
 
  • 1
  • 2
  • 3

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
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

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
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2.5.编写重启模块

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

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

Restart(){
        state=restart
        Stop
        Start
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

2.8.编写查看进程模块

思路:直接用ps查即可

Ps(){
        ps aux | grep redis
}


  
 
  • 1
  • 2
  • 3
  • 4

2.9.编写查看日志模块

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

Logs(){
        tail -f ${redis_home}/logs/${redis_name}.log
}


  
 
  • 1
  • 2
  • 3
  • 4

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 "+-------------------------------------------------------------------------------+"        
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.12编写指令判断模块

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

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


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130

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命令外,所有命令后面都需要加端口号						                         |
+-------------------------------------------------------------------------------+


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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 ~]# 


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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实例没有启动!

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

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 

  
 
  • 1
  • 2
  • 3
  • 4

4.5.登陆redis

启动了redis进行登陆

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

  
 
  • 1
  • 2
  • 3

没有启动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


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4.7.查看日志

持续输出日志信息

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

  
 
  • 1

在这里插入图片描述

文章来源: jiangxl.blog.csdn.net,作者:Jiangxl~,版权归原作者所有,如需转载,请联系作者。

原文链接:jiangxl.blog.csdn.net/article/details/121027928

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。