记grep+wc取值在shell中的结果与手动执行结果不一致的坑

有一个shell脚本来备份mysql数据库,crontab每天凌晨2点启动,但是运行一段时间后发现有时候在备份数据库遇到锁表等情况,导致备份一直在等待,在下一次启动后,又在此处等待了;几天后,后台同时有多个备份脚本在执行;于是打算修改下脚本,在执行备份前判断是否有其他备份脚本在执行,有的话则报错退出并告警;

现象

下面是mysql_bak.sh脚本的一部分

mysql_bak_num=`ps -ef |grep mysql_bak.sh  |grep -v grep|wc -l`
if [ $mysql_bak_num -eq 1 ];then
    for line in `cat databases_list.log`
    do
        fun_mysql_bak $line
    done
else
    echo 'other mysql_bak.sh is runing...'
    exit 1
fi

但是在执行的时候发现,每次都从else跳出,mysql_bak_num返回的是2;

[root@localhost tmp]# sh -x mysql_bak.sh 
++ ps -ef
++ grep mysql_bak.sh
++ grep -v grep
++ wc -l
+ mysql_bak_num=2
+ '[' 2 -eq 1 ']'
+ echo 'other mysql_bak.sh is runing...'
other mysql_bak.sh is runing...
+ exit 1

但是后台确实只有一个mysql_bak.sh在执行;

[root@localhost ~]# ps -ef|grep mysql_bak.sh 
root      1695  1602  0 19:51 pts/0    00:00:00 sh -x mysql_bak.sh

[root@localhost ~]# ps -ef |grep mysql_bak.sh |grep -v grep|wc -l
1
[root@localhost ~]# 

试用了此方法:https://www.cnblogs.com/kevingrace/p/9739500.html,文中指出是由于grep匹配的问题,需要grep进行精准匹配,即"grep -w",于是修改mysql_bak_num=ps -ef |grep -w mysql_bak.sh |grep -v grep|wc -l,测试后mysql_bak_num返回的还是2;

查找很久未果,于是将脚本中$mysql_bak_num -eq 1改为$mysql_bak_num -eq 2

解决办法

暂时没有找到问题,等遇到高人或者查到资料后再完善这篇文章。

逃ε=ε=ε=┏(゜ロ゜;)┛

发表新评论