Краткий ответ: отправьте 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
для онлайн-пользователей. Всегда используйте его для тестирования.
Скрипт убивает изящно
На самом деле меня настолько заинтриговал этот вопрос, что я решил создать небольшой скрипт для этого. Пожалуйста, не стесняйтесь скачать (клонировать) его здесь:
Ссылка GitHub на репозиторий Killgracefully
person
DrBeco
schedule
08.06.2016