我试图找到在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”时会有不同的结果?
所以我的问题是:
为什么脚本发现多个Pid?看来ps中只有一场比赛。
为什么脚本和命令行结果不同?我检查了以前的答案,大多数答案都与grep中的变量或正则表达式有关,但我没有答案。为什么会这样?
谢谢!
答案 0 :(得分:1)
我在@Aaron的帮助下找到了问题-谢谢! 脚本名称是elk_ctl.sh,因此grep与之匹配。 当我将脚本名称更改为不包含“麋鹿”的名称时,问题就消失了。 因此,即使我找不到解释为什么runnig“ status kibana”与“ status”不同的原因,我还是解决了这个问题,因此我建议您这样做。 谢谢所有发表评论的人。