Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Ravi KiranОтветов: 1

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

Я запускаю его на 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.

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

bashshellkill-process

Ответы

Ответ 1 · JamesIsIn

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

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы