Я всегда очень не решаюсь бежать kill -9
, но я вижу, что другие администраторы делают это почти постоянно.
Я полагаю, что есть разумная золотая середина, поэтому:
- Когда и почему следует
kill -9
использовать? Когда и почему нет? - Что нужно попробовать, прежде чем делать это?
- Какая отладка «зависшего» процесса может вызвать дальнейшие проблемы?
Ответы:
Как правило, вы должны использовать
kill
(сокращениеkill -s TERM
или в большинстве системkill -15
) передkill -9
(kill -s KILL
), чтобы дать целевому процессу возможность очиститься после себя. (Процессы не могут перехватить или проигнорироватьSIGKILL
, но они могут и часто делают перехватSIGTERM
.) Если вы не дадите процессу возможность завершить то, что он делает, и очистить, он может оставить поврежденные файлы (или другое состояние) вокруг него. не сможет понять, после перезагрузки.strace
/truss
,ltrace
и,gdb
как правило, хорошие идеи, чтобы посмотреть, почему застрял процесс. (truss -u
в Solaris это особенно полезно; я считаю, чтоltrace
слишком часто приводятся аргументы для вызовов библиотеки в непригодном для использования формате.) В Solaris также есть полезные/proc
инструменты, некоторые из которых были перенесены в Linux. (pstack
часто полезно).источник
kill -9
имеет свое применение как терминатор последней инстанции, акцент на последней инстанции; администраторы, которые используют его перед последним средством а) не слишком хорошо понимают, что такое администратор, и б) не должны быть в производственной системе.Рэндал Шварц часто публиковал «Бесполезное использование (x)» в списках. Один такой пост был о
kill -9
. Это включает причины и рецепт, чтобы следовать. Вот реконструированная версия (цитируется ниже).источник
Это всегда должно быть в порядке
kill -9
, точно так же, как всегда должно быть в порядке, чтобы отключиться, потянув за кабель питания. Это может быть антиобщественным и оставить некоторое восстановление, но это должно сработать, и это мощный инструмент для нетерпеливых.Я говорю это как кто-то, кто сначала попробует обычный kill (15), потому что он дает программе шанс выполнить некоторую очистку - возможно, просто записывает в журнал «выход на sig 15». Но я не приму никаких жалоб на плохое поведение при убийстве -9.
Причина: многие клиенты делают это с тем, что программисты предпочли бы, а затем нет. Случайное уничтожение -9 - это хороший и честный тестовый сценарий, и если ваша система не справляется с этим, ваша система сломана.
источник
kill -9
же, как это не в порядке, чтобы вытащить вилку. Хотя, конечно, бывают ситуации, когда у вас нет выбора, это должно быть последнее действие. Конечно, отсоединение кабеля питанияkill -9
не должно иметь негативных последствий, таких как предотвращение перезапуска приложения или ОС, если это вообще происходит, но дерьмо случается и использование рекомендуемых способов (kill [-15]
) или регулярное отключение поможет избежать беспорядка, который может возникнуть, если Вы регулярно прерываете программы и операционные системы таким образом. В любом случае всегда существует риск потери данных независимо от надежности кода.Я использую kill -9 почти так же, как я бросаю кухонные инструменты в посудомоечную машину: если кухонный инструмент разрушен посудомоечной машиной, то я не хочу этого.
То же самое касается большинства программ (даже баз данных): если я не могу убить их без проблем, я действительно не хочу их использовать. (И если вам случится использовать одну из этих не-баз данных, которая побуждает вас делать вид, что у них есть постоянные данные, а у них их нет: ну, я думаю, пришло время подумать о том, что вы делаете).
Потому что в реальном мире все может ухудшиться в любое время по любой причине.
Люди должны писать программное обеспечение, которое терпимо к сбоям. В частности на серверах. Вы должны научиться проектировать программное обеспечение, которое предполагает, что что-то сломается, сломается и т. Д.
То же самое касается настольного программного обеспечения. Когда я хочу выключить свой браузер, обычно требуется ВОЗРАСТ, чтобы выключиться. Там нет ничего моего браузера нужно сделать , что следует принимать более не более чем несколько секунд. Когда я прошу его закрыть, он должен сделать это немедленно. Если этого не произойдет, тогда мы вытащим kill -9 и сделаем это.
источник
Во всех остальных ответах не упоминается случай, когда он
kill -9
вообще не работает, когда процесс не<defunct>
может быть остановлен:Как я могу убить процесс <defunct>, чьим родителем является init?
Что такое несуществующий процесс и почему его не убивают?
Поэтому , прежде чем пытаться
kill -9
в<defunct>
процессе запуска ,ps -ef
чтобы увидеть , что его родитель и попытаться-15
(TERM) или-2
(INT) и , наконец-9
(сразит) на его родителей.Примечание: что
ps -ef
делает .Дальнейшее редактирование и предостережение: Будьте осторожны, когда убиваете процессы, их родителей или их потомков, потому что они могут оставлять файлы открытыми или поврежденными, соединения незавершенными, могут повреждать базы данных и т. Д., Если вы не знаете, что
kill -9
нужно для процесса, используйте его только в качестве крайней меры и, если вам нужно запустить kill, используйте сигналы, указанные выше, перед использованием-9 (KILL)
источник
Никогда никогда не делай
kill -9 1
. Также избегайте уничтожения некоторых процессов, таких как mount`. Когда мне нужно убить много процессов (скажем, например, зависает X-сессия, и мне нужно убить все процессы определенного пользователя), я меняю порядок процессов. Например:Имейте в виду, что
kill
не останавливает процесс и не высвобождает его ресурсы. Все, что он делает, это посылает сигнал SIGKILL процессу; Вы можете закончить процесс, который зависает.источник
kill -9 1
просто игнорируется под большинством юнитов. Там нет необходимости , чтобы избежатьkill -9
дляmount
, но нет смысла в нем тоже. Я не знаю, что вы подразумеваете под «обратным порядком процессов».kill -9
действительно останавливает (как, например, уничтожает) процесс, не давая ему возможности пожаловаться, однако уничтожение не произойдет немедленно, если процесс находится в непрерывном системном вызове . Уничтожение процессаkill -9
освобождает большинство ресурсов, но не все .Убийство процессов волей-неволей не гладкое движение: данные могут быть потеряны, плохо спроектированные приложения могут незаметно сломаться, что не может быть исправлено без переустановки ... но это полностью зависит от знания того, что и что небезопасно в данная ситуация. и что будет в опасности. Пользователь должен иметь некоторое представление о том, что делает или должен делать процесс и каковы его ограничения (дисковые операции ввода-вывода в секунду, rss / swap) и уметь оценивать, сколько времени должен занимать длительный процесс (например, копия файла, перекодирование в mp3, перенос электронной почты, резервное копирование, [ваш любимый таймсинк здесь].)
Кроме того, отправка
SIGKILL
pid не гарантирует его уничтожения. Если он застрял в системном вызове или уже зомбирован (Z
вps
), он может продолжать зомбироваться. Это часто случается с ^ Z длительным процессом и забывающим,bg
прежде чем пытатьсяkill -9
это сделать. Простоеfg
переподключение stdin / stdout и, возможно, разблокирование процесса, обычно после чего процесс завершается. Если он застрял в другом месте или в какой-либо другой форме тупика ядра, удалить его сможет только перезагрузка. (Процессы Zombie уже мертвы после того,SIGKILL
как обработаны ядром (дальнейший код пользователя не запускается), обычно есть причина в ядре (похожая на «блокировку» в ожидании завершения системного вызова) для завершения процесса.)Кроме того, если вы хотите убить процесс и все его дочерние элементы, привыкните к вызову
kill
с использованием отрицательного PID, а не только самого PID . Там нет никакой гарантииSIGHUP
,SIGPIPE
илиSIGINT
других сигналов очистки после него, и раздражает наличие нескольких процессов для очистки (помните, монгрел?).Бонусное зло:
kill -9 -1
немного более разрушительно, чемkill -9 1
(Не делайте ни от имени root, если вы не хотите видеть, что происходит на одноразовой, неважной виртуальной машине)источник
Почему вы не хотите, чтобы
kill -9
процесс нормальноПо словам
man 7 signal
:Это означает, что приложение, которое получает любой из этих сигналов, не может «перехватить» их, чтобы выполнить какое-либо поведение при завершении работы.
Что вы должны сделать перед запуском
kill -9
процессаПеред отправкой сигнала процессу вы должны убедиться, что вы:
kill -9
в процесс по существу приведет к потере этих данных.источник
Я создал скрипт, который помогает автоматизировать эту проблему.
Это основано на моем полном ответе 2 на вопрос, очень похожий на stackoverflow .
Вы можете прочитать все объяснения там. Подводя итог, я бы порекомендовал просто
SIGTERM
иSIGKILL
, или дажеSIGTERM
,SIGINT
иSIGKILL
. Однако я даю больше вариантов в полном ответе.Пожалуйста, не стесняйтесь скачать (клонировать) его из хранилища GitHub, чтобы убить изящно 1
источник