Аргумент -9 (или
Вместо этого используйте дефолтный сигнал
Если даже сигналу
Использование
Последовательная отправка разных сигналов может вызвать следующие проблемы: во-первых, процессу могут потребоваться секунды, или даже десятки секунд для корректного завершения. Один продукт, которым мне приходилось пользоваться, требовал более 30 секунд для правильного завершения после получения сигнала
Сигналы завершения процесса могут обозначаться по имени или порядковому номеру:
Сигнал
Более подробная информация о сигналах завершения процессов указана в man-страницах kill(1), а команда
KILL
) для команды kill
следует использовать в POSIX-совместимых системах только в случае крайней необходимости. Почему? Сигнал KILL
не может быть обработан процессом. Это означает, что после завершения процесса с помощью kill -9
, дочерние процессы останутся в памяти и станут «осиротевшими» (orphaned), файловая система окажется засорена временными файлами, сегменты совместно используемой памяти — активными, сокеты — зависшими, а функция atexit(3) вообще не будет выполнена. В результате есть риск столкнуться с неожиданными и сложными для отладки проблемами.Вместо этого используйте дефолтный сигнал
TERM
, а KILL
— только если менее проблемные сигналы окажутся неэффективными:$ kill 6738
$ kill -INT 6738
$ kill -HUP 6738
$ kill -KILL 6738
Если даже сигналу
KILL
не удается завершить процесс, это означает, что процесс скорее всего завис при операции ввода-вывода или находится в каком-нибудь другом незавершаемом состоянии. Может потребоваться перезагрузка или принудительное размонтирование глючного сетевого диска.Использование
kill -KILL
по умолчанию допустимо при работе с проблематичным приложением, например, старые версии Netscape частенько завершались только с помощью сигнала KILL
. Однако, это редкое исключение из правила: используйте KILL
для этих заранее известных приложений и только для них.Проблемы, возникающие при завершении процессов
Последовательная отправка разных сигналов может вызвать следующие проблемы: во-первых, процессу могут потребоваться секунды, или даже десятки секунд для корректного завершения. Один продукт, которым мне приходилось пользоваться, требовал более 30 секунд для правильного завершения после получения сигнала
TERM
. К счастью, эта особенность была обнаружена во время тестирования, поэтому для этого случая был написан подходящий скрипт. Во-вторых, иногда бывают ситуации, когда старый процесс завершился, в то время как новый процесс занял его ID в промежутке между сигналами TERM
и KILL
. Особенно этому риску подвергаются системы с повышенной «текучкой» процессов и системы, где ядро назначает PID в случайном порядке, например, OpenBSD. Проверка имени процесса или его PPID не всегда помогает, так как новый процесс может быть форком того же родителя и иметь такое же имя, поэтому особо параноидальные скрипты могут также проверять время создания процесса или другие метаданные перед отправкой сигнала. Возможно эти ситуации возникают редко, но с ними стоит считаться, если приходится иметь дело с критичным процессом.Сигналы завершения процесса
Сигналы завершения процесса могут обозначаться по имени или порядковому номеру:
kill -1
и kill -HUP
эквивалентны. Однако, использование имени сигнала более безопасно, так как при указании аргумента -1 легко опечататься, отправив сигнал другому процессу или даже группе процессов. Также всегда старайтесь использовать имя в скриптах, так как это поможет лучше понять какой тип сигнала отправляется тому, кто будет читать ваш код.Сигнал
HUP
«подвешивает» шелл, поэтому это хороший способ очистить шелл, повисший в ожидании ввода, или закрыть SSH-сессию.Более подробная информация о сигналах завершения процессов указана в man-страницах kill(1), а команда
kill -l
выведет список сигналов, поддерживаемых операционной системой. kill(2) детально описывает системные вызовы. Для более подробной информации, обратитесь к книгам The Design and Implementation of the 4.4 BSD Operating System или UNIX Internals: The New Frontiers.