分享一個shell指令碼的坑:grep匹配+wc取值 在指令碼執行後的結果與手動執行結果不一致

散盡浮華發表於2018-10-03

 

打算在跳板機上寫一個shell指令碼,批量檢查遠端伺服器上的main程式是否在健康執行中。

先找出其中一臺遠端機器,檢視main程式執行情況

[root@two002 tmp]# ps -ef|grep main
root     23448 23422  0 11:40 pts/0    00:00:00 grep --color=auto main

[root@two002 tmp]# ps -ef|grep main|grep -v grep|wc -l
0

shell檢查指令碼如下

[root@two002 tmp]# cat /tmp/main_check.sh 
#!/bin/bash
NUM=$(ps -ef|grep main|grep -v grep|wc -l)
if [ $NUM -eq 0 ];then
   echo "It's not good! main is stoped!"
else
   echo "Don't worry! main is running!"
fi

執行指令碼

[root@two002 tmp]# sh -x /tmp/main_check.sh
++ grep main
++ grep -v grep
++ wc -l
++ ps -ef
+ NUM=2
+ '[' 2 -eq 0 ']'
+ echo 'Don'\''t worry! main is running!'
Don't worry! main is running!

[root@two002 tmp]# sh /tmp/main_check.sh
Don't worry! main is running!

如上執行結果,發現指令碼執行過程中,看到賦予NUM引數的結果值是2但是手動執行ps -ef|grep main|grep -v grep|wc -l的結果明明是0!!
這是由於grep匹配的問題,需要grep進行精準匹配,即"grep -w"。這就需要將main_check.sh指令碼內容修改如下

[root@two002 tmp]# cat /tmp/main_check.sh 
#!/bin/bash
NUM=$(ps -ef|grep -w main|grep -v grep|wc -l)
if [ $NUM -eq 0 ];then
   echo "Oh!My God! It's broken! main is stoped!"
else
   echo "Don't worry! main is running!"
fi

再次執行檢查指令碼,就OK了

[root@two002 tmp]# sh -x /tmp/main_check.sh
++ grep -w main
++ grep -v grep
++ wc -l
++ ps -ef
+ NUM=0
+ '[' 0 -eq 0 ']'
+ echo 'Oh!My God! It'\''s broken! main is stoped!'
Oh!My God! It's broken! main is stoped!

[root@two002 tmp]# sh /tmp/main_check.sh
Oh!My God! It's broken! main is stoped!

故在跳板機上,批量檢查遠端伺服器的main程式執行狀態的指令碼為:

[root@tiaoban ~]# cat /usr/bin/main_check 
#!/bin/bash
NUM=$(ps -ef|grep -w main|grep -v grep|wc -l)
if [ $NUM -eq 0 ];then
   echo "Oh!My God! It's broken! main is stoped!"
else
   echo "Don't worry! main is running!"
fi

[root@tiaoban ~]# cat /opt/script/main_check.sh 
#!/bin/bash

for i in $(cat /opt/ip.list)
do
/usr/bin/rsync -e "ssh -p22" -avpgolr /usr/bin/main_check $i:/usr/bin/ > /dev/null 2>&1
ssh -p22 root@$i "echo $i;sh /usr/bin/main_check"
done  

相關文章