Убить процесс с помощью sh и bash

Мне нужно убить процесс, используя одну и ту же команду как в sh, так и в bash (в сценарии). Обычно я бы сделал следующее в bash:

SCRIPT=$(basename $0) #So the script knows itself
killall -9 $SCRIPT #Kill itself

Однако это не работает с использованием SH

Любые предложения по решению, которое будет работать в любом случае.

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


person Atomiklan    schedule 25.07.2014    source источник
comment
Какой процесс вы пытаетесь убить? Текущая оболочка?   -  person konsolebox    schedule 25.07.2014
comment
Это должно работать как в sh, так и в bash. Если вы пробуете это на разных машинах, проблема, скорее всего, в том, что killall (внешняя команда, не являющаяся частью ни sh, ни bash) недоступна. В любом случае не используйте -9 для уничтожения вашей программы; это предназначено только для остановки глючных программ, которые не реагируют ни на какие другие сигналы. Сигнал по умолчанию (TERM) должен работать нормально; в противном случае попробуйте INT (-2).   -  person chepner    schedule 25.07.2014
comment
Почему бы просто не использовать exit для завершения скрипта? Сценарий самоубийства кажется немного странным.   -  person chepner    schedule 25.07.2014
comment
Выход иногда не работал   -  person Atomiklan    schedule 25.07.2014
comment
Бьюсь об заклад, я знаю, почему. Я считаю, что выход нельзя использовать внутри функций, потому что он просто выходит из функции и не убивает исходный скрипт.   -  person Atomiklan    schedule 25.07.2014
comment
@Atomiklan Если вы планируете убить родительский скрипт, вы можете поиграть с $PPID (может быть доступно только для bash). Просто убедитесь, что вы знаете, что делаете.   -  person konsolebox    schedule 25.07.2014
comment
Спасибо, я думаю, выход действительно сработает.   -  person Atomiklan    schedule 25.07.2014


Ответы (1)


По сути, чтобы позволить сценарию убить себя, укажите ему $$, который представляет идентификатор процесса оболочки.

kill "$$"

Избегайте SIGKILL (9), когда в этом нет необходимости. Используйте его только для приложений, которые значительно перестают отвечать на запросы.

По умолчанию отправляется сигнал SIGTERM (15), но есть и другие сигналы, которые могут также завершить процесс, что может быть безопаснее, чем SIGKILL. Одними из них являются SIGQUIT, SIGABRT и SIGHUP.

person konsolebox    schedule 25.07.2014
comment
Можете ли вы перенаправить Terminated на /dev/null или что-то подобное, чтобы он молчал? - person Atomiklan; 25.07.2014
comment
@Atomiklan Из какого контекста вы вызываете эту команду kill? - person konsolebox; 25.07.2014
comment
Сообщение Terminated отправляется оболочкой, которая отслеживает убитый процесс. Вы должны выполнить disown для этого процесса, чтобы удалить его из таблицы заданий перед его уничтожением. - person konsolebox; 25.07.2014
comment
Похоже, выход сработает, однако это отличное решение для резервного копирования. Спасибо - person Atomiklan; 25.07.2014