it-swarm-ru.tech

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

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

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

  1. Когда и почему следует kill -9 использоваться? Когда и почему нет?
  2. Что нужно попробовать, прежде чем делать это?
  3. Какая отладка "зависшего" процесса может вызвать дальнейшие проблемы?
405
Mikel

Как правило, вы должны использовать kill (сокращение от kill -s TERM или в большинстве систем kill -15) перед kill -9 (kill -s KILL), чтобы дать целевому процессу шанс убраться за собой. (Процессы не могут поймать или игнорировать SIGKILL, но они могут и часто действительно ловят SIGTERM.) Если вы не даете процессу возможность завершить то, что он делает, и очистить его, он может оставить поврежденные файлы (или другое состояние), которые он не сможет понять после перезапуска.

strace/truss, ltrace и ​​gdb, как правило, являются хорошими идеями для выяснения, почему застрял процесс. (truss -u на Солярисе особенно полезен; Я считаю, что ltrace слишком часто представляет аргументы для вызовов библиотеки в непригодном для использования формате.) В Solaris также есть полезные /proc инструменты, некоторые из которых были портированы на Linux. (pstack часто полезно).

366
geekosaur

Рэндал Шварц часто публиковал "Бесполезное использование (x)" в списках. Один такой пост был о kill -9. Это включает причины и рецепт, чтобы следовать. Вот восстановленная версия (цитируется ниже).

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

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

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

1) отключить разъемы

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

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

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

и так далее, и так далее, и так далее.

Как правило, отправьте 15 и подождите секунду или две, и если это не сработает, отправьте 2, а если это не сработает, отправьте 1. Если это не сработает, УДАЛИТЕ ДВОЙНОЙ, потому что программа плохо себя ведет!

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

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

(.подпись)

230
Shawn J. Goff

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

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

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

77
dbrower

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

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

Потому что в реальном мире все может ухудшиться в любое время по любой причине.

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

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

39
borud

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

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

Что такое несуществующий процесс и почему он не убит?

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

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

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

10
Eduard Florinescu

Никогда никогда не делайте 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 процессу; Вы можете закончить процесс, который зависает.

6
HandyGandy

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

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

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

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

5
dhchdhd

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

Он основан на моем полном ответе 2 на вопрос, очень похожий на stackoverflow .

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

Пожалуйста, не стесняйтесь скачать (клонировать) его с GitHub хранилище, чтобы убить изящно1

3
Dr Beco

Почему вы не хотите kill -9 процесс нормальный

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

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

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

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

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

  1. Убедитесь, что процесс не занят (т.е. выполняет "работу"); отправка kill -9 к процессу по существу приведет к потере этих данных.
  2. Если процесс является неотзывчивой базой данных, убедитесь, что он сначала очистил свои кэши. Некоторые базы данных поддерживают отправку других сигналов процессу для принудительной очистки его кэша.
3
user26053