分析:若是不用while循環,咱們只能使用任務計劃cron,但這樣的最小時間是1分鐘,達不到隔30s檢查一次的要求shell
#!/bin/bash while : //這裏的:冒號能夠用true代替,寫的是死循環 do load=`w|head -1|awk -F 'load average: ' '{print $2}'|cut -d. -f1` //給負載load賦值 if [ $load -gt 10 ] then top|mail -s "load is high: $load" asldkfls@11.com fi sleep 30 done
像這種死循環的腳本,爲了避免讓他意外的終止,咱們能夠打開一個screen來運行他
咱們來解析下上面案例中的命令w|head -1|awk -F 'load average: ' '{print $2}'|cut -d. -f1vim
[root@lijie-01 ~]# w|head -1|awk -F 'load average: ' '{print $2}'|cut -d. -f1 0 [root@lijie-01 ~]# w //查看負載 06:56:07 up 13:59, 2 users, load average: 0.05, 0.03, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.75.1 04:52 10:39 0.66s 0.40s vim while.sh root pts/2 192.168.75.1 05:57 7.00s 0.10s 0.00s w [root@lijie-01 ~]# uptime //截取負載信息的第一行 06:56:12 up 13:59, 2 users, load average: 0.04, 0.03, 0.05 [root@lijie-01 ~]# w|head -1 //效果等同於上面一條命令 07:04:21 up 14:07, 2 users, load average: 0.00, 0.01, 0.05 [root@lijie-01 ~]# uptime|awk -F 'load average:' '{print $2}' //以load average:做爲分隔符截取負載信息第一行的第二段 0.02, 0.02, 0.05 [root@lijie-01 ~]# uptime|awk -F 'load average:' '{print $2}'|cut -d. -f1 //再以.做爲分隔符截取第一段 0 [root@lijie-01 ~]# uptime|awk -F 'load average: ' '{print $2}'|cut -d. -f1 //load average: 後面加上空格以去掉上面一條命令運行結果前面的0 0 [root@lijie-01 ~]# uptime|awk -F 'load average:' '{print $2}'|cut -d. -f1|sed 's/ //' //也能夠再用 sed 's/ //'過濾一次以去掉上面一條命令運行結果前面的0 0
咱們還能夠寫成bash
#!/bin/bash while true do load='w|head -1|awk -F `load average: ` `{print $2}` |cut -d. -f1' if [ $load -gt 10 ] then /usr/lib/zabbix/alertscripts/mail.py xxx@qq.com "load high" " $load" fi sleep 30 done
運行結果出錯code
[root@lijie-01 shell]# sh while.sh while.sh: 第 5 行:[: 參數太多
咱們來排查錯誤,發現load賦值語句的引號有問題,修改後提示如下錯誤對象
[root@lijie-01 shell]# sh while.sh while.sh:行4: average:: 未找到命令 while.sh: 第 5 行:[: -gt: 期待一元表達式 ^[while.sh:行4: average:: 未找到命令 while.sh: 第 5 行:[: -gt: 期待一元表達式 while.sh:行4: average:: 未找到命令 while.sh: 第 5 行:[: -gt: 期待一元表達式
結果發現load賦值語句是系統命令,最外層應該使用反引號
,修改後再運行,因爲咱們寫的是死循環,所以腳本處於一直運行的狀態,以下:ip
[root@lijie-01 shell]# sh while.sh
爲了能更明顯的觀察到現象,咱們將腳本修改成當負載小於10發送郵件input
[root@lijie-01 shell]# cat !$ cat while.sh #!/bin/bash while : do load=`w|head -1|awk -F 'load average: ' '{print $2}'|cut -d. -f1` if [ $load -lt 10 ] then /usr/lib/zabbix/alertscripts/mail.py 476189605@qq.com "load high" " $load" fi exit done
[root@lijie-01 shell]# cat !$ cat while2.sh #!/bin/bash while : do read -p "Please input a number: " n if [ -z "$n" ] then echo "你尚未輸入的,請輸入!" continue fi n1=`echo $n|sed 's/[0-9]//g'` if [ ! -z "$n1" ] then echo "你須要輸入一個純數字!" continue fi break done echo $n
下面來執行it
[root@lijie-01 shell]# sh -x while2.sh + : + read -p 'Please input a number: ' n Please input a number: + '[' -z '' ']' + echo '你尚未輸入的,請輸入!' 你尚未輸入的,請輸入! + continue + : + read -p 'Please input a number: ' n Please input a number: 12324dfff + '[' -z 12324dfff ']' ++ sed 's/[0-9]//g' ++ echo 12324dfff + n1=dfff + '[' '!' -z dfff ']' + echo '你須要輸入一個純數字' 你須要輸入一個純數字 + continue + : + read -p 'Please input a number: ' n Please input a number: 3425 + '[' -z 3425 ']' ++ sed 's/[0-9]//g' ++ echo 3425 + n1= + '[' '!' -z '' ']' + break + echo 3425 3425 [root@lijie-01 shell]#
break用於循環語句中awk
#!/bin/bash for i in `seq 1 5` do echo $i if [ $i == 3 ] //若是是數字間的比較,能夠使用-eq;若是比較的對象包含數字外的其餘字符,則必需要使用==來比較 then break fi echo $i done echo abc
執行過程以下:sed
[root@lijie-01 shell]# sh -x break.sh ++ seq 1 5 + for i in '`seq 1 5`' + echo 1 1 + '[' 1 == 3 ']' + for i in '`seq 1 5`' + echo 2 2 + '[' 2 == 3 ']' + for i in '`seq 1 5`' + echo 3 3 + '[' 3 == 3 ']' + break + echo abc abc [root@lijie-01 shell]#
忽略continue之下的代碼,直接進行下一次循環
#!/bin/bash for i in `seq 1 5` do echo $i if [ $i == 3 ] then continue //當i=3時,跳出本次循環 fi echo $i done echo abc
執行過程以下:
[root@lijie-01 shell]# sh continue.sh 1 1 2 2 3 4 4 5 5 abc [root@lijie-01 shell]#
[root@lijie-01 shell]# cat !$ cat exit.sh #!/bin/bash for i in `seq 1 5` do echo $i if [ $i == 3 ] then exit 2 fi echo $i done echo abc
[root@lijie-01 shell]# sh exit.sh 1 1 2 2 3 [root@lijie-01 shell]# echo $? 2 [root@lijie-01 shell]#