情景描述:
需要通过输入的变量值,查询对应Java程序的进程号。
原始版本(有缺陷):
#!/bin/env bash
val="springbootx";
if [ $# -ne 1 ];then
echo "参数数量不正确,只需要一个参数,jar名称。";
exit -1;
else
echo $1;
fi
ids=`ps -ef | grep "$1" | grep -v "grep" | awk '{print $2}'`;
echo $ids;
if [[ -z $ids ]];then
echo "null";
else
echo "no null";
fi
从脚本自身来看,貌似没有问题,但是,执行结果确和预期的不同
单独把查询进程号的命令拿出来执行:
ids=`ps -ef | grep aaaa | grep -v "grep" | awk '{print $2}'`;
可以发现,两者结果不同。
分析:
为什么随便根据任何输入的值,都能查询到进程号了,这个进程号到底是谁的了?
原因:
这个进程号,是被执行的sh脚本自身的。所以,无论你输入什么值,都可以查询到进程号。
改进版本:
#!/bin/env bash
val="springbootx";
if [ $# -ne 1 ];then
echo "参数数量不正确,只需要一个参数,jar名称。";
exit -1;
else
echo $0;
echo $1;
fi
ids=`ps -ef | grep "$1" | grep -v "grep" | grep -v "$0" | awk '{print $2}'`;
echo $ids;
if [[ -z $ids ]];then
echo "null";
else
echo "no null";
fi
过滤掉被执行脚本自身这个进程即可。