记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
解决办法
暂时没有找到问题,等遇到高人或者查到资料后再完善这篇文章。
逃ε=ε=ε=┏(゜ロ゜;)┛