shell腳本查看k8s日志介紹
查看日志:kubectl logs -f podName --tail 100
比如我們如果想查指定的pod,指定行數,指定的內容,
每次都需要輸入kubectl logs -f xxx --tail yyy | grep zzz
為瞭方便,可自定義腳本,輸入sh .sh xxx yyy zzz
即可,並且xxx
支持RE
;
占位符的方式
#!/bin/bash # kubectl get pods #notification x="kubectl logs -f" y="--tail" g="|grep" name=`kubectl get pods | grep ^$1 | awk '{print $1}'` x="eval $x $name $y $2 $g $3" ${x} # sh log.sh podName 20 content # 最終:kubectl logs -f podName --tail 20 | grep content
指定參數 getopts
#!/bin/bash # ":":如果某個選項(option)後面出現瞭冒號(":"),則表示這個選項後面可以接參數 x="kubectl logs -f" y="--tail" g="|grep" while getopts ":n:f:c:" opt do case $opt in n) name=`kubectl get pods | grep ^$OPTARG | awk '{print $1}'` x="$x $name" ;; f) x="$x $y $OPTARG" ;; c) x="$x $g $OPTARG" ;; ?) echo "未知參數" exit 1;; esac done x="eval $x" ${x} # sh log.sh -n podName -f 20 -c content # 最終:kubectl logs -f podName --tail 20 | grep content
問題
1.執行 shell 腳本\r問題
腳本是在window下編輯完成後上傳到linux上執行的,win下的換行是回車符+換行符,也就是\r\n,而unix下是換行符\n。linux下不識別\r為回車符,所以導致每行的配置都多瞭個\r,因此是腳本編碼的問題。
2.命令中的grep
可以發現最終拼接出來的字符串,是一條正確的命令,但是通過${CMD}
執行該變量報錯。
原因:
如果在shell中定義一個命令,帶瞭管道,例如
CMD=“ls -l | grep xx”
直接執行$CMD,會出現如下報錯
ls: cannot access |: No such file or directory
ls: cannot access grep: No such file or directory
管道符會被解釋為普通字符
加上eval
CMD=“eval ls -l | grep xx”
到此這篇關於shell腳本查看k8s日志介紹的文章就介紹到這瞭,更多相關shell查看k8s日志內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- shell腳本讀取命令行參數的實現
- Shell編程中Shift的用法小結
- linux shell 編程之函數使用詳解
- Mac為docker和kubectl添加自動補全命令的方法
- Shell腳本中$符號的幾種用法小結