在脚本或命令行中尝试查找pid时,为什么grep会导致不同的结果?

时间:2019-05-22 09:09:55

标签: bash shell grep pid

我试图找到在Centos7机器上运行的Kibana进程的PID。

我有一个脚本,可以通过运行以下行来找到PID:

kibana_pid=$(ps -ef | grep elk | grep kibana | awk '{print $2}')

(kibana从我创建的麋鹿文件夹中运行)。

此外,在脚本中,我检查了pid(如果用户提供了“状态”摘要):

if [[ $userCommand == "status" && $elk_part == "kibana"  ]]
then
    if [[ -z "$kibana_pid" ]]
    then
            echo "Kibana is not running"
    else
            echo "Kibana is running with pid of: $kibana_pid"
    fi
fi

当我使用这些参数运行脚本时,。/ elk_ctl.sh状态kibana的输出为:

Kibana is running with pid of: 28250
32213
32219

但是当我运行相同的命令在脚本之外查找PID时,在我的命令行中,我得到了正确的结果-只有一个PID号:

$ps -ef | grep elk | grep kibana | awk '{print $2}'

输出:

28250

奇怪的是我跑步的时候

$ ps -ef | grep elk | grep kibana

我只有一行。

编辑1:发现更多奇怪的行为: 我在脚本的开头添加了以下代码,因此可以看到pid是什么:

kibana_pid=$(ps -ef | grep elk | grep kibana | awk '{print $2}')
echo "kibana PID at start is: $kibana_pid"

当我跑步时: ./elk_ctl状态卡宾语

我得到以下输出:

kibana PID at start is: 1634
1640
28250
Kibana is running with pid of: 1634
1640
28250

但是,当我运行此代码时:

./ elk_ctl状态

(这会显示一条拧紧的使用消息)

我得到:

kibana PID at start is: 28250
Wrong use. Please run: ./script start/stop/status elasticsearch/kibana

“状态kibana”组合有什么特别之处,导致找到了多个PID?

编辑2:发现更多奇怪的行为: 我将脚本开头的回显行更改为显示:

echo `ps -ef | grep elk | grep kibana`

输出为: 对于./elk_ctl状态kibana-

Name 2229 25111 0 12:54 pts/4 00:00:00 /bin/bash ./elk_ctl.sh status kibana 
Name 2240 2229 0 12:54 pts/4 00:00:00 /bin/bash ./elk_ctl status kibana 
Name 28250 1 0 11:05 pts/3 00:00:20 /home/Name/elk/kibana/bin/../node/bin/node --no-warnings /home/Name/elk/kibana/bin/../src/cli
Kibana is running with pid of: 2229
2235
28250

./ elk_ctl.sh状态-

Name 28250 1 0 11:05 pts/3 00:00:20 /home/Name/elk/kibana/bin/../node/bin/node --no-warnings /home/Name/elk/kibana/bin/../src/cli
Wrong use. Please run: ./script start/stop/status elasticsearch/kibana

再说一遍,为什么当我使用“ status kibana”而不是“ status”时会有不同的结果?

所以我的问题是:

  1. 为什么脚本发现多个Pid?看来ps中只有一场比赛。

  2. 为什么脚本和命令行结果不同?我检查了以前的答案,大多数答案都与grep中的变量或正则表达式有关,但我没有答案。为什么会这样?

谢谢!

1 个答案:

答案 0 :(得分:1)

我在@Aaron的帮助下找到了问题-谢谢! 脚本名称是elk_ctl.sh,因此grep与之匹配。 当我将脚本名称更改为不包含“麋鹿”的名称时,问题就消失了。 因此,即使我找不到解释为什么runnig“ status kibana”与“ status”不同的原因,我还是解决了这个问题,因此我建议您这样做。 谢谢所有发表评论的人。