千家信息网

向大家分享一个shell脚本的坑

发表于:2024-10-20 作者:千家信息网编辑
千家信息网最后更新 2024年10月20日,打算在跳板机上写一个shell脚本,批量检查远程服务器上的main进程是否在健康运行中。先找出其中一台远程机器,查看main进程运行情况[root@two002 tmp]# ps -ef|grep m
千家信息网最后更新 2024年10月20日向大家分享一个shell脚本的坑

打算在跳板机上写一个shell脚本,批量检查远程服务器上的main进程是否在健康运行中。

先找出其中一台远程机器,查看main进程运行情况

[root@two002 tmp]# ps -ef|grep mainroot     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

shell检查脚本如下

[root@two002 tmp]# cat /tmp/main_check.sh#!/bin/bashNUM=$(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.shDon'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/bashNUM=$(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.shOh!My God! It's broken! main is stoped!

故在跳板机上,批量检查远程服务器的main进程运行状态的脚本为:

[root@tiaoban ~]# cat /usr/bin/main_check#!/bin/bashNUM=$(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>&1ssh -p22 root@$i "echo $i;sh /usr/bin/main_check"done  


0