Я пытаюсь убить процесс с помощью сценария оболочки. Похоже, что в этом процессе убивается сама оболочка. Также я вижу ненулевое возвращаемое значение скрипта в терминале.
Я запускаю его на 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.
Ответ 1 · JamesIsIn
Если вы хотите, чтобы код выхода вашей последней запущенной команды был кодом выхода для сценария, ваш сценарий должен заканчиваться на выход $? как последняя строка. Любая предшествующая функция также должна заканчиваться символом $? поэтому цепочка течет к этой последней строке. В противном случае имеет место какой-то другой выход.
Если сценарий уничтожается вместе с приложением или сценарием, которые вы пытаетесь убить, то ваша работа ps и grep, скорее всего, включает в себя оба результата. Посмотрите на вывод ps и grep во время работы скрипта. Вы можете добавить строку перед строкой уничтожения, которая просто показывает вывод ps и greps, чтобы вы могли видеть, что на самом деле убивают.
Наконец (и я не думаю, что это так), если вы пытаетесь завершить сценарий после уничтожения, вручную запустите выход (опять же, вероятно, используя exit $? по причине, указанной выше), где это уместно в сценарии.
Надеюсь, это поможет вам добраться туда, куда вы идете.