Сценарий оболочки, возвращающий ненулевое значение после процесса уничтожения - PullRequest
0 голосов
/ 22 октября 2019

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

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

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

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

sudo ./myscript.sh

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

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

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

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

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

1 Ответ

0 голосов
/ 22 октября 2019

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

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

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

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

...