Сценарий оболочки, возвращающий ненулевое значение после завершения процесса

Я пытаюсь убить процесс с помощью сценария оболочки. Похоже, что в этом процессе убивается сама оболочка. Также я вижу ненулевое возвращаемое значение скрипта в терминале.

Я запускаю его на Amazon Linux 2 с помощью sudo.

#!/bin/bash
kill -9 $(ps -ef | grep myapp | grep -v grep | awk '{print $2}')

Я выполняю как:

sudo ./myscript.sh

"Эхо $?" после выполнения возвращает 137 вместо нуля. Может кто-нибудь, пожалуйста, помогите понять, что происходит не так.

Еще одно наблюдение: если я напрямую запускаю команду kill в своем терминале, то есть ниже команды,

kill -9 $(ps -ef | grep myapp | grep -v grep | awk '{print $2}')

Я вижу эхо $? возвращает ноль.

Обновление: проблема решена. Имя процесса, который я пытаюсь убить, совпадает с именем моего скрипта. Следовательно, grep возвращает оба pid. Оба процесса убиваются. Также узнал, что лучший способ сделать это с помощью pkill или pidof() для получения pid.


person Ravi Kiran    schedule 22.10.2019    source источник
comment
Я бы проверил, что kill действительно убивает здесь, выполнив set -x перед запуском команды и проверив ее вывод.   -  person user1934428    schedule 22.10.2019
comment
Это гнойная куча антипаттернов. Вы хотите pkill и действительно хотите избежать -9   -  person tripleee    schedule 22.10.2019


Ответы (1)


Если вы хотите, чтобы код выхода вашей последней запущенной команды был кодом выхода для сценария, ваш сценарий должен заканчиваться на выход $? как последняя строка. Любая предшествующая функция также должна заканчиваться символом $? поэтому цепочка течет к этой последней строке. В противном случае имеет место какой-то другой выход.

Если сценарий уничтожается вместе с приложением или сценарием, которые вы пытаетесь убить, то ваша работа ps и grep, скорее всего, включает в себя оба результата. Посмотрите на вывод ps и grep во время работы скрипта. Вы можете добавить строку перед строкой уничтожения, которая просто показывает вывод ps и greps, чтобы вы могли видеть, что на самом деле убивают.

Наконец (и я не думаю, что это так), если вы пытаетесь завершить сценарий после уничтожения, вручную запустите выход (опять же, вероятно, используя exit $? по причине, указанной выше), где это уместно в сценарии.

Надеюсь, это поможет вам добраться туда, куда вы идете.

person JamesIsIn    schedule 22.10.2019
comment
Если сценарий уничтожается вместе с приложением или сценарием, которые вы пытаетесь убить, то ваша работа ps и grep, вероятно, включает в результаты и то, и другое —> Это правильно. Имя процесса, который я пытаюсь убить, совпадает с именем моего скрипта. следовательно, обоих убивают. Большое спасибо за ответ, - person Ravi Kiran; 09.11.2019
comment
Вы найдете руководства по стилю, которые рекомендуют называть ваши сценарии оболочки как scriptName.sh, поскольку это позволяет избежать таких ситуаций, с которыми вы сталкивались сами. Наше рабочее руководство по стилю требует, чтобы наши скрипты заканчивались на .sh, и я считаю это лучшей практикой. Не забудьте отметить это как принятый ответ, если он решил вашу проблему. Спасибо! - person JamesIsIn; 12.11.2019