Команда killall

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

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

$ killall [параметры] имя-процесса

Команда поддерживает ряд параметров командной строки. Наиболее полезными параметрами являются параметр -s, позволяющий указать системный сигнал, который будет отправлен заданному процессу, параметр -l, позволяющий вывести список поддерживаемых системных сигналов, параметр -i, позволяющий активировать интерактивный режим работы утилиты, параметр -g, позволяющий отправить системный сигнал группе процессов, параметр -I, позволяющий не учитывать регистр символов в имени процесса, параметры -y и -o позволяющие отправить системный сигнал процессу, который моложе или старше заданного времени, параметр -u, позволяющий отправить системный сигнал лишь процессу указанного пользователя и параметр -w, позволяющий дождаться завершения работы процесса, которому был отправлен системный сигнал. Что касается системных сигналов, то они могут задаваться в нескольких форматах по аналогии с командой kill с небольшими отличиями:

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

По умолчанию утилита осуществляет осуществляет отправку сигнала SIGTERM для корректного завершения работы процессов.

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

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

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

$ killall -l
HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT
CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH POLL PWR SYS

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

Для завершения работы процесса достаточно передать его имя утилите killall. В данном случае в качестве рассматриваемого процесса будет использоваться предварительно запущенный процесс 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

Его имя заранее известно. Если вам нужно убедиться в функционировании процесса с данным именем, имеет смысл использовать команду top или ps aux (во второй вкладке эмулятора терминала):

$ ps aux | grep ping

alex 15686 0.0 0.0 18888 1032 pts/0 S+ 21:27 0:00 ping 127.0.0.1
alex 15708 0.0 0.0 17628 920 pts/1 S+ 21:29 0:00 grep ping

Интересующий нас процесс исполняется и имеет идентификатор 15686. Для его завершения достаточно использовать команду killall (также во второй вкладке эмулятора терминала):

$ killall 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.053 ms

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

Разумеется, если в системе будет запущено несколько процессов ping, сигнал будет отправлен каждому из них.

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

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

$ killall ping

В команду:

$ killall -s SIGKILL 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.050 ms

64 bytes from 127.0.0.1: icmp_seq=9 ttl=64 time=0.051 ms
Убито

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

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

$ killall ping

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

$ kill -s SIGSTOP ping

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

$ kill -s SIGCONT 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.067 ms

64 bytes from 127.0.0.1: icmp_seq=8 ttl=64 time=0.053 ms
[1]+ Остановлен ping 127.0.0.1

После исполнения второй — продолжится:

64 bytes from 127.0.0.1: icmp_seq=10 ttl=64 time=0.048 ms
64 bytes from 127.0.0.1: icmp_seq=11 ttl=64 time=0.053 ms

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

Для завершения работы процесса заданного пользователя вам придется указать имя этого пользователя после параметра -u. Кроме того, вам могут понадобиться права суперпользователя.

Для этого следует преобразовать недавно рассмотренную команду:

$ killall ping

В команду:

# killall -u root ping

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

# 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.051 ms

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

Ожидание завершения работы процесса

В случае разработки сценариев командной оболочки может оказаться полезной функция ожидания завершения работы процесса с указанным именем. Для этого предназначен параметр -w. В результате ранее рассмотренная команда:

$ killall ping

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

$ killall -w 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.052 ms

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