Когда я не должен убивать -9 процесс?

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

Я полагаю, что есть, вероятно, разумная средняя земля, поэтому:

  1. Когда и зачем следует использовать kill -9? Когда и почему нет?
  2. Что следует попробовать перед этим?
  3. Какая отладка «зависающего» процесса может вызвать дополнительные проблемы?
377 голосов | спросил Mikel 9 MarpmWed, 09 Mar 2011 13:13:04 +03002011-03-09T13:13:04+03:0001 2011, 13:13:04

9 ответов


341

Как правило, вы должны использовать 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 часто помогает).

ответил geekosaur 9 MarpmWed, 09 Mar 2011 13:26:48 +03002011-03-09T13:26:48+03:0001 2011, 13:26:48
216
Рэндал Шварц часто публиковал «Бесполезное использование (x)» в списках. Один такой пост был о kill -9. Он включает в себя причины и рецепт для подражания. Вот реконструированная версия (приведенная ниже ).
  

(Цитата мерзости)

     

Нет, нет. Не используйте kill -9.

     

Это не дает этому процессу возможности:

     

1) отключить соединения сокетов

     

2) очистка временных файлов

     

3) сообщите своим детям, что он уходит

     

4) сбросить свои характеристики терминала

     

и т. д. и т. д. и т. д.

     

Как правило, отправьте 15 и подождите секунду или два, и если это не сработает, отправьте 2, и если это не сработает, отправьте 1. Если это не так, удалите BINARY, потому что программа плохо себя ведет!

     

Не используйте kill -9. Не выводите комбайн только для того, чтобы убрать цветочный горшок.

     

Простое использование Usenet,

     

(. Подпись)

ответил Shawn J. Goff 9 MarpmWed, 09 Mar 2011 15:29:01 +03002011-03-09T15:29:01+03:0003 2011, 15:29:01
72

Всегда должно быть ОК, чтобы выполнить kill -9, так же, как всегда должно быть ОК для завершения работы, потянув за кабель питания. Он может быть антисоциальным и оставлять некоторое выздоровление, но он должен работать и является инструментом власти для нетерпеливого.

Я говорю об этом как о ком-то, кто сначала попробует просто убить (15), потому что он дает программе возможность сделать некоторую очистку - возможно, просто записывается в журнал, выходящий на sig 15. Но я не буду принимать жалобы на плохое поведение при убийстве -9.

Причина: многие клиенты делают это с тем, что предпочитают программисты. Случайное тестирование kill -9 - хороший и справедливый сценарий тестирования, и если ваша система не справляется с этим, ваша система не работает.

ответил dbrower 28 Jam1000000amTue, 28 Jan 2014 10:11:13 +040014 2014, 10:11:13
35

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

То же самое относится к большинству программ (даже баз данных): если я не могу их убить без каких-либо проблем, я не хочу их использовать. (И если вы используете одну из этих не-баз данных, которая побуждает вас притворяться, что они сохраняют данные, когда они этого не делают: ну, я думаю, пришло время подумать о том, что вы делаете).

Потому что в реальном мире вещи могут спуститься в любой момент по любой причине.

Люди должны записывать программное обеспечение, терпимое к сбоям. В частности, на серверах. Вы должны научиться разрабатывать программное обеспечение, которое предполагает, что что-то сломается, сбой и т. Д.

То же самое можно сказать и о программном обеспечении для настольных компьютеров. Когда я хочу закрыть свой браузер, обычно отключается AGES. Существует nothing для моего браузера , для этого требуется не более чем на пару секунд. Когда я попрошу его закрыть, он должен немедленно это сделать. Когда это не так, хорошо, тогда мы вытаскиваем kill -9 и делаем его.

ответил borud 28 Jpm1000000pmTue, 28 Jan 2014 19:46:04 +040014 2014, 19:46:04
9

Не упоминается во всех других ответах, это случай, когда kill -9 вообще не работает, когда процесс <defunct> и не может быть убит

Как я могу убить <defunct> процесс, родитель которого является init?

Что является несуществующим для процесс и почему его не убивают?

Итак, прежде чем вы попытаетесь выполнить kill -9 процесс <defunct> запустите ps -ef, чтобы узнать, что его родитель и попытаться -15 (TERM) или -2 (INT) и, наконец, -9 (KILL) для его родителя.

Примечание: что ps -ef .

Позже отредактируйте и предостерегите: Будьте осторожны при убийстве процессов, их родителя или их детей, потому что они могут оставлять файлы открытыми или поврежденными, незавершенными подключениями, могут испортить базы данных и т. д., если вы не знаете что kill -9 делает для процесса, используйте его только в крайнем случае, и если вам нужно запустить kill, используйте вышеописанные сигналы перед использованием -9 (KILL) суб>

ответил Eduard Florinescu 28 Jpm1000000pmTue, 28 Jan 2014 19:17:25 +040014 2014, 19:17:25
6

Никогда не делайте kill -9 1. Также избегайте совершать убийство на определенных процессах, таких как mount`. Когда мне приходится убивать много процессов (скажем, например, X-сеанс зависает, и мне приходится убивать все процессы определенного пользователя), я отменяю порядок процессов. Например:

ps -ef|remove all processes not matching a certain criteria| awk '{print $2}'|ruby -e '$A=stdin.readlines; A.reverse.each{|a| puts "kill -9 #{a}"}'|bash

Имейте в виду, что kill не останавливает процесс и не освобождает его ресурсы. Все, что он делает, это отправить сигнал SIGKILL в процесс; вы можете завершить процесс, который висел.

ответил HandyGandy 9 MarpmWed, 09 Mar 2011 13:29:26 +03002011-03-09T13:29:26+03:0001 2011, 13:29:26
5

Процесс убийства волей-неволей - это не плавный ход: данные могут быть потеряны, плохо разработанные приложения могут ломаться тонкими способами, которые невозможно зафиксировать без переустановки .. но это полностью зависит от знания того, что есть и чего нет безопасным в данной ситуации.  и что будет в опасности. Пользователь должен иметь представление о том, какой процесс должен выполняться или должен выполняться, и каковы его ограничения (дисковый IOPS, rss /swap) и быть в состоянии оценить, сколько времени потребуется длительному процессу (скажем, копия файла, mp3 reencoding, миграция электронной почты, резервное копирование, [ваш любимый timesink здесь].)

Кроме того, отправка SIGKILL в pid не гарантирует его убийство. Если он застрял в syscall или уже зомбирован (Z в ps), он может продолжать быть зомбированным. Это часто бывает в случае, когда Z Z работает долго и забывает bg перед тем, как попытаться выполнить kill -9. Простой fg повторно подключит stdin /stdout и, возможно, разблокирует процесс, обычно после этого завершается процесс. Если он застрял где-то в другом месте или в какой-то другой форме блокировки ядра, только перезагрузка может удалить процесс. (Процессы Zombie уже мертвы после того, как ядро ​​обработает SIGKILL (никакой дальнейший код пользователя не будет запущен), обычно есть причина ядра (аналогично тому, как «заблокировано», ожидая завершения syscall) для процесс не заканчивается.)

Кроме того, если вы хотите убить процесс и все его дочерние элементы, привыкните вызывать kill с помощью отрицательного PID, а не только самого PID . Нет гарантии SIGHUP, SIGPIPE или SIGINT или других сигналов, очищающих после него, и с пучком отключенных процессов для очистки (помните mongrel ?) раздражает.

Бонусное зло: kill -9 -1 немного более разрушительно, чем kill -9 1 (не делайте ни одного из них как root, если вы не хотите видеть что происходит на выбросе, неважному VM)

ответил Barry 25 Mayam14 2014, 05:33:20
3

Почему вы не хотите, чтобы kill -9 обычно выполнялся

В соответствии с man 7 signal:

  

Сигналы SIGKILL и SIGSTOP не могут быть пойманы, заблокированы или проигнорированы.

Это означает, что приложение, которое получает один из этих сигналов, не может «поймать» их, чтобы выполнить какое-либо поведение при выключении.

Что вы должны сделать перед запуском kill -9 в процессе

Вы должны убедиться, что перед отправкой сигнала процессу, который вы:

  1. Убедитесь, что процесс не занят (т.е. выполняется «работа»); передача kill -9 в процесс приведет к потере этих данных.
  2. Если процесс является невосприимчивой базой данных, убедитесь, что он сначала очистил свои кеши. Некоторые базы данных поддерживают отправку других сигналов в процесс, чтобы принудительно сбросить его кеш.
ответил user1529891 24 Maypm14 2014, 20:07:28
2

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

Он основан на моем полном ответе 2 в вопросе, очень близком к stackoverflow .

Вы можете прочитать все объяснения там. Подводя итог, я бы рекомендовал просто SIGTERM и SIGKILL или даже SIGTERM, SIGINT и SIGKILL код>. Однако я даю больше вариантов в полном ответе.

Пожалуйста, не стесняйтесь загружать (клонировать) его из gitub репозитория для убийства 1

ответил Dr Beco 8 J0000006Europe/Moscow 2016, 07:54:51

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132