Команда kill

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

Базовый синтаксис команды выглядит следующим образом:

$ kill [параметры] идентификатор-процесса

Команда поддерживает ряд параметров командной строки. Наиболее полезным параметром является параметр -s, позволяющий указать системный сигнал, который может быть отправлен заданному процессу, а также параметр -l, позволяющий вывести список поддерживаемых системных сигналов. Вообще, сигналы могут задаваться в нескольких форматах:

  • В формате имени сигнала после параметра -s (-s SIGKILL)
  • В формате номера сигнала после параметра -n (-n 5)
  • В формате номера сигнала (-5)
  • В формате имени сигнала с префиксом SIG (-SIGKILL)
  • В формате имени сигнала без префикса SIG (-KILL)

По умолчанию команда осуществляет осуществляет отправку сигнала SIGTERM для корректного завершения работы процессов. Отрицательные значения идентификаторов используются для указания групп процессов, которым нужно отправить сигналы. Идентификатор -1 является специализированным идентификатором и используется для отправки сигналов всем запущенным процессам за исключением kill и init. Для получения идентификаторов процессов могут использоваться утилиты ps и top.

Примеры использования

Получение списка поддерживаемых системных сигналов

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

$ 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
16) SIGSTKFLT 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
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

Завершение работы процесса

Для завершения работы процесса достаточно передать его идентификатор команде kill. В данном случае в качестве рассматриваемого процесса будет использоваться предварительно запущенный процесс ping (в первой вкладке эмулятора терминала):

$ ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.058 ms

Для получения его идентификатора достаточно использовать команду ps aux, а также фильтр grep ping (во второй вкладке эмулятора терминала):

$ ps aux | grep ping

alex 14371 0.0 0.0 18888 1024 pts/0 S+ 21:08 0:00 ping 127.0.0.1
alex 14381 0.0 0.0 17628 908 pts/1 S+ 21:08 0:00 grep ping

Процесс имеет идентификатор 14371. Для его завершения достаточно использовать команду kill (также во второй вкладке эмулятора терминала):

$ kill 14371

В результате исполнение процесса будет остановлено (в первой вкладке эмулятора терминала):

$ ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.058 ms

64 bytes from 127.0.0.1: icmp_seq=37 ttl=64 time=0.052 ms
Завершено

Завершение работы зависшего процесса

В случае зависшего процесса или процесса, игнорирующего сигнал SIGTERM, следует использовать сигнал SIGKILL. Для этого следует преобразовать недавно рассмотренную команду:

$ kill 14371

В команду:

$ kill -s SIGKILL 14371

Исполнение процесса должно завершиться в любом случае.

Приостановка и продолжение исполнения процесса

Для приостановки и продолжения исполнения процессов следует использовать сигналы SIGSTOP и SIGCONT соответственно. Да, как вы наверняка уже догадались, ранее рассмотренная команда:

$ kill 14371

Превратится в команду для приостановки исполнения процесса:

$ kill -s SIGSTOP 14371

Или команду для продолжения исполнения процесса:

$ kill -s SIGCONT 14371