Короткий ответ : Отправить SIGTERM
, через 30 секунд, SIGKILL
. То есть отправьте SIGTERM
, подождите немного (это может отличаться от программы к программе, вы можете лучше знать свою систему, но достаточно от 5 до 30 секунд. При выключении машины вы можете увидеть, что она автоматически ждет до 1:30 секунд. Зачем все-таки спешить?), То пошлите SIGKILL
.
Разумный ответ : SIGTERM
, SIGINT
, SIGKILL
Это больше , чем достаточно. Весьма вероятно, что процесс завершится раньше SIGKILL
.
Длинный ответ : SIGTERM
, SIGINT
, SIGQUIT
, SIGABRT
,SIGKILL
В этом нет необходимости, но, по крайней мере, вы не вводите в заблуждение процесс, касающийся вашего сообщения. Все эти сигналы действительно означает , что вы хотите , чтобы процесс остановить то , что он делает и выход.
Неважно, какой ответ вы выберете из этого объяснения, имейте это в виду!
Если вы отправляете сигнал, который означает что-то еще, процесс может обработать его по-разному (с одной стороны). С другой стороны, если процесс не обрабатывает сигнал, в конце концов, не имеет значения, что вы отправляете, процесс все равно завершится (когда действие по умолчанию, конечно, завершается).
Итак, вы должны думать как программист. Вы бы закодировали обработчик функции, скажем, SIGHUP
для выхода из программы, которая к чему-то подключается, или вы бы зациклили ее, чтобы попытаться подключиться снова? Это главный вопрос! Вот почему важно просто посылать сигналы, которые означают то, что вы намереваетесь.
Почти глупый длинный ответ :
В таблице ниже содержатся соответствующие сигналы и действия по умолчанию в случае, если программа их не обрабатывает.
Я заказал их в том порядке, который я предлагаю использовать (кстати, я предлагаю вам использовать разумный ответ , а не этот здесь), если вам действительно нужно попробовать их все (было бы забавно сказать, что таблица упорядочена с точки зрения разрушения, которые они могут вызвать, но это не совсем так).
Сигналы со звездочкой (*) НЕ рекомендуются. В них важно то, что вы никогда не узнаете, на что они запрограммированы. Специально SIGUSR
! Он может запустить апокалипс (это бесплатный сигнал для программиста делать все, что он хочет!). Но, если она не обрабатывается ИЛИ, в маловероятном случае, она завершается, программа завершается.
В таблице сигналы с параметрами по умолчанию для завершения и генерации дампа ядра оставлены в конце, непосредственно перед SIGKILL
.
Signal Value Action Comment
----------------------------------------------------------------------
SIGTERM 15 Term Termination signal
SIGINT 2 Term Famous CONTROL+C interrupt from keyboard
SIGHUP 1 Term Disconnected terminal or parent died
SIGPIPE 13 Term Broken pipe
SIGALRM(*) 14 Term Timer signal from alarm
SIGUSR2(*) 12 Term User-defined signal 2
SIGUSR1(*) 10 Term User-defined signal 1
SIGQUIT 3 Core CONTRL+\ or quit from keyboard
SIGABRT 6 Core Abort signal from abort(3)
SIGSEGV 11 Core Invalid memory reference
SIGILL 4 Core Illegal Instruction
SIGFPE 8 Core Floating point exception
SIGKILL 9 Term Kill signal
Тогда я предложил бы для этого почти глупого длинного ответа :
SIGTERM
, SIGINT
, SIGHUP
, SIGPIPE
, SIGQUIT
, SIGABRT
,SIGKILL
И наконец,
Определенно глупый длинный длинный ответ :
Не пытайтесь делать это дома.
SIGTERM
, SIGINT
, SIGHUP
, SIGPIPE
, SIGALRM
, SIGUSR2
, SIGUSR1
, SIGQUIT
, SIGABRT
, SIGSEGV
, SIGILL
, SIGFPE
И , если ничего не получалось, SIGKILL
.
SIGUSR2
следует попробовать раньше, SIGUSR1
потому что нам будет лучше, если программа не обрабатывает сигнал. И у него гораздо больше шансов справиться, SIGUSR1
если он обработает только один из них.
Кстати, УБИЙСТВО : отправить SIGKILL
в процесс - это нормально, как сказано в другом ответе. Ну подумайте, а что будет при отправке shutdown
команды? Будет стараться SIGTERM
и SIGKILL
только. Как вы думаете, почему это так? А зачем вообще нужны другие сигналы, если сама shutdown
команда использует только эти два?
Теперь, возвращаясь к длинному ответу , это хорошая единственная строка:
for SIG in 15 2 3 6 9 ; do echo $SIG ; echo kill -$SIG $PID || break ; sleep 30 ; done
Между сигналами он спит 30 секунд. Зачем еще вам нужен одинарный лайнер ? ;)
Также рекомендуется: попробуйте только сигналы 15 2 9
из разумного ответа .
безопасность : снимите второй, echo
когда будете готовы к работе. Я называю это моим dry-run
для онлайн-пользователей . Всегда используйте его для тестирования.
Скрипт killgracefully
На самом деле меня настолько заинтриговал этот вопрос, что я решил создать небольшой скрипт для этого. Пожалуйста, не стесняйтесь скачать (клонировать) его здесь:
Ссылка GitHub на репозиторий Killgracefully