ps -ef | grep -v grep 踩坑(纪实)

先说结论:

如果你要利用ps -ef | grep系列命令,查询某进程号并返回PID,你编写了脚本,并且脚本带参数。那么请将脚本名一并过滤掉,否则就会多返回两个意外的线程号(也不算意外,其实非常合理)

再说遭遇:

我需要一个shell脚本,帮助我运行一个测试jar包,然后在运行前需要判断是否已经正在运行;
我写了包含 PID = ps -ef | grep AAA.jar | grep -v grep | awk '{print $2}' 在内的一个脚本,脚本有两个输入参数,命名为AutoTest.sh;
执行起来是./AutoTest.sh start 192.168.xxx.xxx的样子;
运行后,每次输出的PID都会多出两个;
我想了想,可能是查询到了命令语句自身;
但我看着grep -v grep陷入思考,这明明已经过滤了呀;
然后开始了不停的尝试;
同事发现,不带参数的脚本,会输出正常结果;
我以为是参数的问题,但无法解释;
然后继续追究原因,为了方便,我把脚本拷贝出来复制几份,改了名字;
其中有一个叫做AutoTestBygrep.sh;
这个脚本,也可以正常返回结果,即便加上参数,也是正常的;

最后总结:

大家一定想到了,就是脚本的原因。
一条明明能够过滤自身的命令,在带参数的脚本中无法过滤自身和这个脚本的进程信息。必须把脚本名一并过滤,才能正常返回想要的结果。

ps -ef | grep AAA.jar | grep -v grep | awk '{print $2}' 单独在命令行执行,是没问题的。放在不带参数的脚本里,也没问题。一旦你的脚本带参数,就不对了。

具体什么原因,我能猜到和命令的执行逻辑相关,和脚本参数输入的进程状态相关。但具体怎么回事确实不懂。
有懂的欢迎留言,谢谢!我学习学习。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值