Короткий ответ : Отправить SIGTERM
, 30 секунд спустя, SIGKILL
. То есть отправьте SIGTERM
, подождите немного (это может варьироваться от программы к программе, вы можете лучше знать свою систему, но достаточно 5–30 секунд. При выключении машины вы можете увидеть, что она автоматически ожидает до 1 30-х годов. Почему спешка, в конце концов?), А затем отправить SIGKILL
.
Разумный ответ : SIGTERM
, SIGINT
, SIGKILL
Этого более чем достаточно. Процесс очень , вероятно, прекратится до SIGKILL
.
Длинный ответ : SIGTERM
, SIGINT
, SIGQUIT
, SIGABRT
, SIGKILL
В этом нет необходимости, но, по крайней мере, вы не вводите в заблуждение процесс, касающийся вашего сообщения. Все эти сигналы do означают, что вы хотите, чтобы процесс остановил свою работу и завершил работу.
Независимо от того, какой ответ вы выберете из этого объяснения, имейте это в виду!
Если вы отправляете сигнал, который означает что-то другое, процесс может обработать его различными способами (с одной стороны). С другой стороны, если процесс не обрабатывает сигнал, в конце концов, не имеет значения, что вы отправляете, процесс все равно завершится (если, конечно, действие по умолчанию завершается).
Итак, вы должны думать как программист. Вы бы закодировали обработчик функции, скажем, для 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 секунд между сигналами. Зачем еще вам нужен oneliner ? ;)
Также рекомендуется: попробуйте только с сигналами 15 2 9
из разумного ответа .
безопасность : уберите второе echo
, когда будете готовы к работе. Я называю это dry-run
для лайнеров . Всегда используйте его для проверки.
Сценарий убито грациозно
На самом деле я был настолько заинтригован этим вопросом, что решил создать небольшой сценарий, чтобы сделать именно это. Пожалуйста, не стесняйтесь скачать (клонировать) это здесь:
Ссылка GitHub на Хранилище Killgracefully