点击上方“我的小碗汤”,选择“置顶公众号”

精品文章,第一时间送达

redis在容器化的过程中,涉及到纵向扩pod实例cpu、内存以及redis实例的maxmemory值,statefulset管理的pod需要重启。所以把redis集群的状态检查放到了健康检查中,依赖statefulset的原生能力(pod实例ready后才重启下一个,readyendpoints controllerpod信息更新到endpoints资源对象中),而没有在redis operator中写逻辑去判断。

需要用redis-cli -h {redis实例IP} ping查看redis是否正常,同时用redis-cli -c -h {redis实例IP} -a {redis密码} cluster info输出的信息解析cluster_state的值是否为ok,以及cluster_known_nodes的值是否为1,判断redis集群是否正常;

  • 如果redis集群刚创建,cluster_known_nodes1cluster_statefail;

  • 如果redis集群为纵向扩容(扩CPU、内存)升级重启,cluster_known_nodes不为1,cluster_stateok时才认为集群正常,才能重启下一个pod

因为涉及到字符串相等判断,所以用以下这样判断:

if [ "$cluster_known_nodes"x = "1"x  ]; then.....fi

但是判断一直有问题,如下图,在$a后面加个x,会变为在开头覆盖式的加a结果就是判断结果不相等。

redis-cli -c -h {redis实例IP} -a {redis密码} cluster info执行的结果重定向到文件里。

vi 1.txt查看文件,在vi里用set ff命令查看文件格式为unix,但是文件每一行后面都有一个^M的特殊字符,这就是问题所在了。

最主要是通过cat都看不出来特殊字符的存在。

手动把^M特殊字符删掉就好了。

网上说^Mwindows格式文本文件的换行符\r\n,可以用dos2unix命令转为unix格式。但是执行cluster info命令全程在linux中操作,而且重定向到文件中set ff命令看到也是unix格式。这点还是很费解。

先用sed命令将^M换掉,试了sed  's/^M//g'没有用,所以选择用sed 's?\r??g'替换,最终脚本如下。

if语句的[[]]需要用bash执行,用sh执行会报错[[: not found

#!/bin/bash#需要用redis-cli -h {redis实例IP} ping查看redis是否正常#用redis-cli -c -h {redis实例IP} -a {redis密码} cluster info输出#的信息解析cluster_state的值是否为ok,以及cluster_known_nodes的值是#否为1,判断redis集群是否正常;如果redis集群刚创建,cluster_known_nodes#为1,cluster_state为fail;如果redis集群为纵向扩容(扩CPU、内存)升级重启#cluster_known_nodes不为1,cluster_state为ok时才认为集群正常,才能重启#下一个pod,改健康检查脚本旨在维护升级时redis集群状态,不在operator中维护# 利用好statefulset一个实例ready后重启下一个pod的特性pingres=$(redis-cli -h $(hostname) ping)# cluster_state:ok# cluster_slots_assigned:16384# cluster_slots_ok:16384      # cluster_slots_pfail:0        # cluster_slots_fail:0        # cluster_known_nodes:6        # cluster_size:3                # cluster_current_epoch:15      # cluster_my_epoch:12          # cluster_stats_messages_sent:270782059# cluster_stats_messages_received:270732696pingres=$(echo "${pingres}" | sed 's?\r??g')if [[ "$pingres"x = "PONG"x ]]; then    clusterinfo=$(redis-cli -c -h ${PODIP} cluster info)    # redis-cli -c -h ${PODIP} cluster info output info include ^M(win \n\r) char lead to error, so use sed 's?\r??g'    clusterknownnodes=$(echo "${clusterinfo}" | grep cluster_known_nodes | sed 's?\r??g' | awk -F ':' '{print $2}')    clusterstate=$(echo "${clusterinfo}" | grep cluster_state | sed 's?\r??g' | awk -F ':' '{print $2}')    echo "clusterknownnodes: ${clusterknownnodes} --- clusterstate: ${clusterstate}"    # [[ need run this script use /bin/bash instead of /bin/sh    # if语句的[[]]需要用bash执行,用sh执行会报错[[: not found    if [[ "${clusterknownnodes}"x = "1"x && "${clusterstate}"x = "ok"x ]]; then        echo "--1--"        exit 0    elif [[ "${clusterknownnodes}"x != "1"x && "${clusterstate}"x = "ok"x ]]; then        echo "--2--"        exit 0    # create redis cluster    elif [[ "${clusterknownnodes}"x = "1"x && "${clusterstate}"x != "ok"x ]]; then        echo "--3--"        exit 0    elif [[ "${clusterknownnodes}"x != "1"x && "${clusterstate}"x != "ok"x ]]; then        echo "--4--"        exit 1    else        echo "--5--"        exit 1    fielse    exit 1fi

一般这种怪异的问题都是脚本里有特殊字符造成的,可以在脚本中set list显示特殊字符。当然windows上编辑过的脚本在linux上运行一般dos2unix test.sh这样转换一下最好,免的遇到麻烦。

参考:

shell中括号的特殊用法 linux if多条件判断

https://www.cnblogs.com/jjzd/p/6397495.html

运行shell脚本时报错"[[ : not found"解决方法

https://www.cnblogs.com/han-1034683568/p/7211392.html

 • end • 


本公众号免费提供csdn下载服务,海量IT学习资源,如果你准备入IT坑,励志成为优秀的程序猿,那么这些资源很适合你,包括但不限于java、go、python、springcloud、elk、嵌入式 、大数据、面试资料、前端 等资源。同时我们组建了一个技术交流群,里面有很多大佬,会不定时分享技术文章,如果你想来一起学习提高,可以公众号后台回复【2】,免费邀请加技术交流群互相学习提高,会不定期分享编程IT相关资源。


扫码关注,精彩内容第一时间推给你

adb echo shell 覆盖_一次写shell脚本的经历记录相关推荐

  1. loadrunner java脚本_用loadrunner11写java脚本小例子(java Vuser)

    1.创建工程testHelloWorld 2.写个经典的HelloWorld类,代码如下: package jd.lt; public class HelloWorld { public String ...

  2. python 发送邮件不显示附件_求助:写python脚本发 带有附件的邮件, 收到邮件后,发现附件直接显示在屏幕上了,而不是以附件形式...

    不知道为什么会这样,以下是我从网上参考的pythoncode:fromAdd='odps.testmail@alibaba-inc.com'title='RepPrjStat'ccList=''toL ...

  3. 游戏脚本用什么语言写_为什么要写分镜头脚本?

    分镜头脚本是最实用的影视创作脚本,它是在文学脚本的基础上运用蒙太奇思维和蒙太奇技巧进行再创作的脚本,即根据拍摄提纲或文学脚本,参照拍摄现场的实际情况,分隔场次或段落,并运用形象的对比.呼应.积累.暗示 ...

  4. 用python写脚本测试_用python写测试脚本永久费苹果

    方法一: PublicFunctionFastReplace(SSrch$,SFind$,SRepl$)AsString DimSrc()AsByte,Dst()AsByte,R()AsByte,F( ...

  5. Mysql 后台日志写shell(root权限)

    Mysql 写shell 一.后台日志写shell 前提: 需要有root权限 outfile被禁止 文件写入被拦截 1.查看配置 是否开启写日志 日志写入路径 show variables like ...

  6. shell的相关知识(变量、脚本定义)

    一.shell的相关知识: 1.对于shell编程语言大体分为:机器语言.汇编语言.高级语言 2.shell变量类型:事先确定数据的存储格式和长度 shell变量分为:字符型.数值型 数值型又分为:整 ...

  7. linux shell脚本攻略第3版_「技术干货」师傅说不会写shell脚本的网安不是一个好黑客,实战...

    shell脚本? 在说什么是shell脚本之前,先说说什么是shell. shell是外壳的意思,就是操作系统的外壳.我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就 ...

  8. adb shell 书籍_开发必备---你应该知道的一些 ADB 命令

    版权声明:本文为LooperJing原创文章,转载请注明出处! 一.设备相关 1.adb devices 显示连接到计算机的设备 List of devices attached be34d81e d ...

  9. python调用adb shell命令_如何在python脚本里面连续执行adb shell后面的各种命令

    如何在python脚本里面连续执行adb shell后面的各种命令 adb shell "cd /data/local && mkdir tmp" adb shel ...

最新文章

  1. 水题/poj 1852 Ants
  2. 关于 AppDelegate 、UIApplication 简单的用法
  3. iPhoneX适配随笔
  4. 偶然在网上看到的题目,jQuery功底如何一测便知晓!!!!!!
  5. 计算机在学前教育和美术绘画中的应用,幼儿园美术教学活动中信息技术的应用...
  6. Nginx【学习笔记】
  7. mysql数据库架构_MySQL数据库之互联网常用架构方案
  8. can是什么时候处于显性_can总线通信原理 显性
  9. Loadrunner中web_reg_save_param的使用详解
  10. mysql多表查询练习_MySQL多表查询综合练习答案
  11. ORACLE数据库自带的opath,oracle11.2.0.4.0 数据库安装
  12. PHP安卓获取gpgga,对于GPS模块数据接收和提取的问题分析
  13. mybatis文档地址
  14. 支持Android 11安卓Flash播放器终极版源码方案2022(1:概叙)
  15. wordpress简约淘客主题风格附详细实例教程源码
  16. 微信小程序之猜拳游戏
  17. r语言echarts画箱线图_echarter: Echarts的R语言接口
  18. KeyShot 11.1 现已推出
  19. How to solve the lossless offline problem of Spring Cloud Alibaba service instance in Kubernetes
  20. 安全运维到安全运营的转变

热门文章

  1. 惊艳!28岁就任副教授,年纪轻轻已是博导、院长
  2. 教育部最新公布!2019年高校新增和撤销了这些本科专业
  3. 我国博士不是太多了,而是太少了!
  4. 46㎡老公房,经建筑设计师神级爆改,中国母子哭了出来
  5. 深度解析| 揭开中国紫砂壶背后惊人的大内幕!
  6. java文件下载至linux乱码,JAVA 文件下载乱码问题解决办法
  7. shell读取文件并且遍历输出
  8. java中的IO操作之File类
  9. 数据结构实验之排序四:寻找大富翁
  10. ROS(3)订阅者subscriber编程实现