Перейти к содержимому

Kill 9 linux что значит

  • автор:

What is the purpose of the -9 option in the kill command?

The kill command will send a defined signal to a process with a given identity (PID):

Of course we can only kill processes we own, whereas root can kill all processes. See Wikipedia for a nice summary of computing signals.

Signals kill can send are listed in the manpage. The signal can be represented by name or by number. If no signal is given the default signal 15 resp. TERM is used.

All three commands below are therefore identical:

The difference between SIGTERM and SIGKILL is the way an application may act on the signal:

  • TERM : an application will be able to terminate, i.e. properly run a shutdown routine.
  • KILL : the applications is stopped and killed immediately (which could lead to data loss or raising apport to report a presumed crash in some cases).

The Ubuntu man page for kill explains the purpose of the -9 switch (admittedly in a rather choppy fashion):

The command kill sends the specified signal to the specified process or process group. If no signal is specified, the TERM signal is sent. The TERM signal will kill processes which do not catch this signal. For other processes, it may be necessary to use the KILL ( 9 ) signal, since this signal cannot be caught.

Therefore, using the -9 switch ensures that the process is effectively killed. Even though a frozen or unresponsive process may not respond to a simple TERM signal, it will die when sent a KILL signal.

Note that all of the following are synonymous:

It’s worth pointing out that in the world of signal handling, SIGKILL is one of the few unique ones that is handled by the operating system not the program. When you run kill -9 , you’re not telling the application to terminate itself, instead you’re telling the OS to stop running the program, no matter what the program is doing.

After SIGKILL is sent, the program will immediately be stopped. If any kernel calls are running (e.g. File IO) on the program’s behalf, those calls may or may not continue until they finish, depending on the call, but the program itself will not run any more. Note that traced tasks or tasks running under a debugger may behave differently here.

The other signal that can’t be blocked is SIGSTOP which has a similar effect, but instead freezes the program; you can send SIGCONT later on to resume it. This behavior is completely controlled by the OS, and the program does not get any prior notification.

All the other signals are sent to the program; it can handle them however it chooses, or if it ignores the signal then a default behavior is followed.

Here are a few useful signals that you may find yourself sending to a process:

  • SIGHUP — hangup
    Tells the program that the user disconnected (e.g. SSH session or terminal window was closed).
    Usually does a graceful shutdown of the program.
  • SIGINT — interrupt
    Sent when you hit CTRL + C
    Usually means «stop what you’re doing» — may or may not kill the program
  • SIGTERM — terminate
    The default sent by kill and killall .
    Usually terminates the program. sometimes after the program finishes whatever it’s doing.
  • SIGSTOP — stop
    Sent when you hit CTRL + Z
    Pauses the program, discussed above
  • SIGPIPE — pipe closed
    Tells the program that the the pipeline has closed. Usually terminates the program.
    For example cat /etc/passwd | head -n1 will send SIGPIPE to the cat process after the first line is printed, causing cat to terminate before finishing the whole file.

While all of these signals happen «naturally» in their own setting, you can use the signal to fake a condition to achieve the desired result.

For example, if you want to terminate someone’s SSH session you can simply kill the process, but by doing so you’ll prevent it from updating its HISTORY file, which may be important for security reasons. But instead if you send it SIGHUP, then the process will assume the connection has died and will perform its standard cleanup.

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

Аргумент -9 (или 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.

Команда kill в Linux

Linux — отличная и продвинутая операционная система, но она не идеальна. Время от времени некоторые приложения могут начать работать нестабильно, перестать отвечать на запросы или начать потреблять много системных ресурсов. Не отвечающие приложения не могут быть перезапущены, потому что исходный процесс приложения никогда не завершается полностью. Единственное решение — либо перезапустить систему, либо убить процесс приложения.

Есть несколько утилит, которые позволяют завершать ошибочные процессы, kill наиболее часто используемые.

Команда kill

kill — это оболочка, встроенная в большинство оболочек, таких как Bash и Zsh. Поведение команд немного отличается между оболочками и автономным исполняемым файлом /bin/kill .

Используйте команду type чтобы отобразить все места в вашей системе, содержащие kill :

Приведенный выше вывод говорит о том, что встроенная оболочка имеет приоритет над автономным исполняемым файлом и используется всякий раз, когда вы вводите kill . Если вы хотите использовать двоичный файл, введите полный путь к файлу /bin/kill . В этой статье мы будем использовать встроенный Bash.

Синтаксис команды kill имеет следующий вид:

Команда kill отправляет сигнал указанным процессам или группам процессов, заставляя их действовать в соответствии с сигналом. Если сигнал не указан, по умолчанию используется значение -15 (-TERM).

Наиболее часто используемые сигналы:

  • 1 ( HUP ) — перезагрузить процесс.
  • 9 ( KILL ) — убить процесс.
  • 15 ( TERM ) — изящно остановить процесс.

Чтобы получить список всех доступных сигналов, вызовите команду с параметром -l :

Сигналы можно указать тремя разными способами:

  1. Использование числа (например, -1 или -s 1 ).
  2. Использование префикса «SIG» (например, -SIGHUP или -s SIGHUP ).
  3. Без префикса «SIG» (например, -HUP или -s HUP ).

Следующие команды эквивалентны друг другу:

PID, предоставленные команде kill могут быть одним из следующих:

  • Если PID больше нуля, сигнал отправляется процессу с идентификатором, равным PID .
  • Если PID равен нулю, сигнал отправляется всем процессам в текущей группе процессов. Другими словами, сигнал отправляется всем процессам, принадлежащим GID оболочки, вызвавшей команду kill . Используйте команду ps -efj для просмотра идентификаторов групп процессов (GID).
  • Если PID равен -1 , сигнал отправляется всем процессам с тем же UID, что и пользователь, вызывающий команду. Если вызывающий пользователь является пользователем root, сигнал отправляется всем процессам, кроме init и самого процесса kill .
  • Если PID меньше -1 , сигнал отправляется всем процессам в группе процессов eq с GID, равным абсолютному значению PID .

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

Завершение процессов с помощью команды kill

Чтобы завершить или убить процесс с помощью команды kill , сначала вам нужно найти идентификационный номер процесса (PID). Вы можете сделать это с помощью различных команд, таких как top , ps , pidof и pgrep .

Допустим, браузер Firefox перестал отвечать, и вам нужно остановить процесс Firefox. Чтобы найти идентификаторы PID браузера, используйте команду pidof :

Команда распечатает идентификаторы всех процессов Firefox:

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

Вместо того, чтобы искать PID и затем убивать процессы, вы можете объединить приведенные выше команды в одну:

Перезагрузка процессов с помощью команды kill

Другой распространенный вариант использования kill — это отправить сигнал HUP , который сообщает процессам о необходимости перезагрузки его настроек.

Например, чтобы перезагрузить Nginx , вам необходимо отправить сигнал главному процессу. Идентификатор основного процесса Nginx можно найти в файле nginx.pid , который обычно находится в каталоге /var/run .

Используйте команду cat чтобы найти главный PID:

Как только вы найдете главный PID, перезагрузите настройки Nginx, набрав:

Приведенная выше команда должна запускаться от имени пользователя root или пользователя с привилегиями sudo .

Выводы

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

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

What does the option -9 mean for killall?

I saw the command killall -9 but there is not such a option in the man page.

So now I’m a bit confused: what does -9 option mean?

Gilles 'SO- stop being evil''s user avatar

3 Answers 3

(I assume you’re talking about the Linux killall command.)

The option -9 is listed in a generic way under —SIGNAL . The description specified that

Signals can be specified either by name (e.g. -HUP or -SIGHUP ) or by number (e.g. -1 ) or by option -s .

So you can use killall -9 or killall -s 9 to send signal number 9, killall -42 or killall -s 42 to send signal number 42, etc. You can use killall -KILL or killall -s KILL to send the KILL signal, etc.

On traditional and modern Unix systems and on most POSIX systems, signal number 9 is the kill signal. On many systems you can use kill -l 9 to list the signal name corresponding to number 9; in bash, kill -l lists the recognized signal names with their corresponding numbers.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Капельница от запоя — облегчение за 15–20 минут