Когда вы пытаетесь завершить процесс навсегда, какой вариант «убить» следует использовать?

26

Я получаю много смешанных сообщений от людей, и мне было интересно, если это действительно не так много различий в том, что вы используете.

kill 'x'
killall 'x'
kill -9 'x'

Это некоторые варианты, которые мне уже сказали использовать, но некоторые люди говорят, что kill -9 - это просто перебор, kill сам по себе не работает и т. Д.

Есть ли у кого-нибудь совет, какой из них следует использовать в наиболее стандартном случае просто завершения процесса (и, следовательно, его состояния)?

[edit] Я ищу, что использовать, когда вы хотите остановить выполнение вашего процесса, чтобы вы могли запустить новый, с самого начала

Чак Теста
источник
1
См. Также письмо с бланком UUK9, которое предостерегает от злоупотреблений SIGKILL.
jw013
1
Вывести список всех различных сигналов вместе с их номером: kill -lи преобразовать число в соответствующее имя сигнала, например kill -l 9, вернется KILL.

Ответы:

24

Есть ряд сигналов, чье расположение по умолчанию - завершить процесс. Сигнал окончательного завершения - SIGKILL, так как он не может быть обработан, и у процесса нет иного выбора, кроме как умереть. Это, однако, также означает, что если вы отправите его, процесс лишится возможности очистки. Следовательно, хорошие манеры требуют посылки сигнала типа SIGTERM, который может быть обработан первым и только если процесс не завершится через некоторое время, отправьте его SIGKILL.

Обратите внимание, что SIGINT и SIGQUIT не являются хорошими кандидатами для произвольного завершения процесса. Из-за того, что они могут генерироваться с клавиатуры терминала, многие приложения используют их для специальных целей. Например, интерпретатор python использует SIGINT для генерации KeyboardInterruptисключения (также в интерактивных сеансах python, когда он просто возвращается к приглашению), а JVM использует SIGQUIT для вывода следов стека. SIGINT и SIGQUIT остаются эффективными для большинства стандартных утилит командной строки, таких как findили cat.

Во время выключения системы большинство систем UNIX и Linux отправляют SIGTERM всем процессам, затем 5 секунд ожидания, а затем SIGKILL. Это рекомендуемый способ безопасного завершения произвольного процесса.

Также обратите внимание, что даже SIGKILL не может завершить процесс, застрявший в непрерывном ожидании, пока процесс не проснется.

Адам Зальцман
источник
1
Отличный ответ. У вас есть рекомендации для kill -SIGTERM $pid; sleep 5; kill -SIGKILL $pid;рекомендации?
10
+1 вид ответа. А как насчет SIGHUP?
Алоис Махдал
2
@AloisMahdal: SIGHUPприходит со дня, когда линии дозвона были обычным явлением. Этот сигнал был отправлен, чтобы указать, что линия зависла. Позже, когда это было менее распространено SIGHUP, демоны иногда использовали его для перечитывания файла конфигурации без перезапуска процесса. В эти современные времена SIGHUPредко используется. Многие демоны будут иметь свой собственный способ повторной инициализации (т . apachectl gracefulrndc reconfig[init.d|smf|upstart|launchd]
Е.
13

Вы должны начать с самого мягкого и перерасти оттуда. Это означает, SIGINT, SIGTERM, SIGQUIT, SIGKILL. Хотя большинство людей пропускают SIGINT и SIGQUIT.

Игнасио Васкес-Абрамс
источник
Кроме того, некоторые приложения (например, JDK) по-разному обрабатывают SIGQUIT. Я, вероятно, не стал бы использовать SIGQUIT, не зная, как конкретное приложение справляется с этим.
dimo414