先说结论:
如果你要利用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}'
单独在命令行执行,是没问题的。放在不带参数的脚本里,也没问题。一旦你的脚本带参数,就不对了。
具体什么原因,我能猜到和命令的执行逻辑相关,和脚本参数输入的进程状态相关。但具体怎么回事确实不懂。
有懂的欢迎留言,谢谢!我学习学习。