Какова цель опции -9 в команде kill?

Ответы:

28

Страница killруководства Ubuntu для объясняет назначение -9переключателя (правда, довольно изменчиво):

Name     Num   Action    Description
KILL       9   exit      cannot be blocked

Вот что говорит другая страница руководства.

Команда killотправляет указанный сигнал указанному процессу или группе процессов. Если сигнал не указан, TERMсигнал отправляется. TERMСигнал будет убивать процессы , которые не поймать этот сигнал. Для других процессов может потребоваться использование сигнала KILL( 9), поскольку этот сигнал не может быть перехвачен.


Следовательно, использование -9переключателя гарантирует, что процесс будет эффективно убит. Даже если замороженный или не отвечающий процесс может не отвечать на простой TERM сигнал, он умрет при отправке KILLсигнала.

SirCharlo
источник
40

Команда kill отправит определенный сигнал процессу с заданным идентификатором (PID):

kill -<signal> <pid>

Конечно, мы можем уничтожать только те процессы, которые у нас есть, тогда как root может уничтожать все процессы. Посмотрите Википедию для хорошего обзора вычислительных сигналов.

Сигналы, которые killможно отправить, перечислены на странице руководства . Сигнал может быть представлен по имени или по номеру. Если сигнал не подается, сигнал по умолчанию 15 соотв. TERMиспользуется.

Поэтому все три команды ниже идентичны:

kill -9 1234
kill -KILL 1234
kill -SIGKILL 1234

Разница между SIGTERMи SIGKILLв том, как приложение может воздействовать на сигнал:

  • TERM: приложение сможет завершиться, то есть правильно запустить процедуру завершения работы.
  • KILL: приложения останавливаются и немедленно уничтожаются (что может привести к потере данных или повышению аппорта, чтобы в некоторых случаях сообщать о предполагаемом сбое).
Takkat
источник
16

Обратите внимание, что все следующее является синонимом:

kill -9 1234
kill -KILL 1234
kill -SIGKILL 1234

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

После отправки сообщения SIGKILL программа будет немедленно остановлена. Если какие-либо вызовы ядра выполняются (например, File IO) от имени программы, эти вызовы могут продолжаться или не продолжаться, пока не завершатся, в зависимости от вызова, но сама программа больше не будет запускаться. Обратите внимание, что отслеживаемые задачи или задачи, выполняемые в отладчике, могут вести себя иначе.

Другим сигналом, который нельзя заблокировать, является SIGSTOP, который имеет аналогичный эффект, но вместо этого останавливает программу; Вы можете отправить SIGCONT позже, чтобы возобновить его. Это поведение полностью контролируется ОС, и программа не получает никаких предварительных уведомлений.

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

Вот несколько полезных сигналов, которые вы можете отправлять процессу:

  • SIGHUP - зависание
    Сообщает программе, что пользователь отключился (например, был закрыт сеанс SSH или окно терминала).
    Обычно делает изящное завершение программы.
  • SIGINT - прерывание
    Отправляется, когда вы нажимаете CTRL+ C
    Обычно означает «остановить то, что вы делаете» - может или не может убить программу
  • SIGTERM - прекратить
    По умолчанию отправлено killи killall.
    Обычно завершает программу ... иногда после того, как программа завершает все, что она делает.
  • SIGSTOP - остановить
    Отправляется, когда вы нажимаете CTRL+ Z
    Пауза программы, обсуждалось выше
  • SIGPIPE - труба закрыта
    Сообщает программе, что конвейер закрыт. Обычно завершает программу.
    Например cat /etc/passwd | head -n1, отправит SIGPIPE catпроцессу после печати первой строки, что приведет catк завершению до завершения всего файла.

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

Например, если вы хотите прекратить чей-то сеанс SSH, вы можете просто завершить процесс, но тем самым вы не сможете обновить его файл HISTORY, что может быть важно по соображениям безопасности. Но вместо этого, если вы отправите SIGHUP , процесс будет считать, что соединение разорвано, и выполнит стандартную очистку.

tylerl
источник
Ctrl + \ посылает SIGQUIT, где действие по умолчанию - сбросить ядро ​​и завершиться. Это может быть использовано, если программа делает что-то очень неправильное, вам нужно немедленно остановить это, и вы хотели бы иметь возможность отладить это позже.
Саймон Рихтер
@SimonRichter О, ты прав. исправлено.
Тайлер
6

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

Использование: SIGKILL Singal

Значение Kill : Команда kill без какого-либо сигнала пропускает сигнал 15, который завершает процесс обычным способом.

Использует: сигнал SIGTERM , который может обрабатываться программистами

devav2
источник