日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/9/27 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 adb echo shell 覆盖_一次写shell脚本的经历记录 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? 點擊上方“我的小碗湯”,選擇“置頂公眾號”

精品文章,第一時間送達

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脚本的经历记录的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。