分享一个shell脚本的坑:grep匹配+wc取值 在脚本执行后的结果与手动执行结果不一致

打算在跳板机上写一个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  

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏kangvcar

Git - git push origin master 报错的解决方法

12730
来自专栏人工智能LeadAI

在NVIDIA Jetson TX2上安装TensorFlow

刷机的目的是把Ubuntu操作系统和JetPack SDK安装到Jetson TX2上。刷机的操作按照官方教程即可,比较容易。这个过程中有一点需要注意:Jets...

36420
来自专栏乐享123

What Do Cryptic Github Comments Mean?

15440
来自专栏Aloys的开发之路

Ubuntu 16.04安装DB2 Express C v11.1

样例:需要执行的命令 样例:注释 jiangxin@db01:~$ su – root #切换到root用户 密码: root@db01:~# uname -a...

412100
来自专栏【转载】DRF+Vue+Mysql_生鲜超市系统

六、商品类别数据展示

 接口相关代码都放在src/api/api.js里面,调试接口的时候我们首先需要新建一个自己的host,然后替换要调试的host

29700
来自专栏腾讯移动品质中心TMQ的专栏

Android手机上用户操作模拟方法的研究与实现

一、 问题背景 最近研究了一下Android手机上用户操作的模拟方法, 有一些心得与大家分享下。 之所以去研究Android手机上用户操作的模拟方法,是因为最...

1.2K60
来自专栏AI科技评论

开发 | 在 Mac OS X 装不上 TensorFlow?看了这篇就会装

AI科技评论按:本文原作者Enachan。本文原载于作者的GitHub。译者投稿,雷锋网版权所有。 这个文档说明了如何在 Mac OS X 上安装 Tensor...

36770
来自专栏iOS开发笔记

cordova插件-File Transfer

添加插件 $ cordova plugin addcordova-plugin-file-transfer ? 图 15如上则插入成功 插件的使用 Meth...

381110
来自专栏大数据-Hadoop、Spark

Hadoop CombineTextInputFormat的使用

14730
来自专栏Golang语言社区

Golang web服务器处理前端HTTP请求跨域的方法

package main import ( "flag" "fmt" "net" "net/http" ) type httpServer struct { }...

40550

扫码关注云+社区

领取腾讯云代金券