Почему grep приводит к различным результатам при использовании в скрипте или в командной строке - при попытке найти pid? - PullRequest
3 голосов
/ 22 мая 2019

Я пытаюсь найти PID процесса Kibana, запущенного на моей машине Centos7.

У меня есть скрипт, который находит PID, запустив следующую строку:

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

(kibana запускается из созданной мною папки elk.

Кроме того, в сценарии я проверяю pid, если пользователь предоставляет агрегацию «status»:

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"

Когда яrun: ./elk_ctl status kibana

Я получаю этот вывод:

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

Когда я запускаю это, однако:

./elk_ctl status

(что приводит к сообщению об использовании wring)

Я получаю:

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

Что такого особенного в комбо "status kibana", которое получаетсяв более чем одном найденном PID?

РЕДАКТИРОВАТЬ 2: обнаружено более странное поведение: я изменил строку эха в начале скрипта, чтобы показать:

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

И вывод: for./elk_ctl status 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

for ./elk_ctl.sh status -

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 Ответ

1 голос
/ 22 мая 2019

Я нашел проблему с помощью @Aaron - спасибо! Имя скрипта - elk_ctl.sh, поэтому grep соответствует ему. Когда я изменил имя сценария на имя, не содержащее слова «лось», проблема исчезла. Поэтому, хотя я не мог найти объяснение того, почему «статус кибана» отличался от «статуса», я решил проблему, поэтому считаю это ответом. Спасибо всем, кто прокомментировал.

...