11.4. kill

Иногда некоторые программы выходят из под контроля и тогда вам нужно “поставить их на место”. Программа для такого вида администрирования называется kill(1). Также её можно использовать для управления процессами разными способами. Самым очевидным способом использования kill является убивание процесса (от англ. kill - убивать). Вам придётся воспользоваться этой программой в том случае, если программа вышла из под контроля и начинает использовать много системных ресурсов или если вас просто тошнит от её работы.

Чтобы убить процесс, вам нужно знать его PID или имя. Чтобы узнать идентификатор, воспользуйтесь командой ps, описанной в предыдущем разделе. Например, чтобы убить процесс 4747, вам нужно выполнить следующее:

% kill 4747

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

Существует ещё одна разновидность утилиты kill под название killall(1). Эта программа полностью соответствует своему названию (kill all - убить всех): она убивает все работающие процессы с заданным именем. Если вам нужно убить все процессы vim, вы можете набрать следующую команду:

% killall vim

Все запущенные вам процессы с именем vim будут убиты. Выполнив эту команду под root'ом, вы убьёте также все процессы vim, запущенные пользователями системы. Это также представляет собой интересный способ для выбрасывания из системы всех пользователей (включая самого вас):

# killall bash

Иногда обычный kill не справляется с поставленной задачей. Определённые процессы не будут умирать. Тогда вам нужно использовать более сильное средство. Если этот упрямый PID 4747 не отвечает на ваш запрос kill, вы можете выполнить следующее:

% kill -9 4747

Это наверняка заставит процесс 4747 умереть. То же самое вы можете использовать и с killall. В данном случае вы просто отправляете процессу другой сигнал. Обычный вызов kill отправляет процессу сигнал SIGTERM (terminate), который сообщает ему, что нужно остановить свою работу, сбросить буферы и выгрузить себя из памяти. kill -9 отправляет процессу сигнал SIGKILL (kill), который по сути просто убивает его. Процессу не разрешается “чисто” завершить свою работу, и иногда это приводит к нежелательным последствиям, таким как повреждение данных. Ниже представлен полный список сигналов. Вы можете получить этот список с помощью следующей команды:

% kill -l
  1) SIGHUP     2) SIGINT    3) SIGQUIT   4) SIGILL
  5) SIGTRAP    6) SIGABRT   7) SIGBUS    8) SIGFPE
  9) SIGKILL   10) SIGUSR1  11) SIGSEGV  12) SIGUSR2
 13) SIGPIPE   14) SIGALRM  15) SIGTERM  17) SIGCHLD
 18) SIGCONT   19) SIGSTOP  20) SIGTSTP  21) SIGTTIN
 22) SIGTTOU   23) SIGURG   24) SIGXCPU  25) SIGXFSZ
 26) SIGVTALRM 27) SIGPROF  28) SIGWINCH 29) SIGIO
 30) SIGPWR

В kill нужно использовать только числа, а в killall можно использовать названия сигналов без приставки “SIG”. Вот ещё один пример:

% killall -KILL vim

И напоследок, одним из полезных вариантов использования kill является перезапуск процесса. Отправка большинству процессов сигнала SIGHUP заставит их повторно прочитать свои конфигурационные файлы. Это особенно полезно для сообщения системным процессам о том, что им нужно перечитать свои конфигурационные файлы после того, как вы их отредактировали.