В операционных системах Linux есть команда Kill, прерывающая процесс. Она позволяет серверу продолжать работу после серьезных изменений и обновлений без необходимости перезагрузки. Это одно из важнейших преимуществ Linux и одна из причин того, почему она установлена на 90% серверов в мире. Команда kill отправляет процессу специальный сигнал. Ее можно запустить различными способами, непосредственно из командной строки или из скрипта.
Синтаксис
Использование команды kill из /usr/bin предоставляет дополнительную возможность прервать процесс по его имени при помощи pkill. Стандартный синтаксис команды kill следующий:
# kill [сигнал или опция] идентификатор(ы) процесса(ов)
Для команды kill существует около 60 сигналов, но основные значения следующие:
Имя сигнала | Номер сигнала | Действие |
SIGHUP | 1 | Отключить |
SIGKILL | 9 | “Убить” |
SIGTERM | 15 | Прервать |
SIGTERM используется по умолчанию. Это самый безопасный способ прерывания процесса, когда приложению отправляется запрос, который может быть обработан или проигнорирован. SIGHUP — менее безопасный способ. SIGKILL — наименее безопасный вариант, прерывание процесса без сохранения, этот сигнал не может быть проигнорирован или перехвачен.
Идентификаторы процессов
Чтобы прервать (“убить”) процесс, нам нужно знать его идентификатор (Process ID или PID). Он генерируется автоматически при запуске каждой программы и есть у каждого процесса в Linux. Первый процесс, запускаемый при загрузке Linux — init, поэтому в большинстве случаев ему присваивается идентификатор ‘1’.
Init — системный процесс, его нельзя прервать таким образом. При получении сигнала он сам решает, позволить ли себя прервать, таким образом, команда kill становится просто запросом на отключение системы. Это сделано для того, чтобы исключить случайное прерывание системных процессов.
Увидеть все запущенные процессы и соответствующие им идентификаторы можно при помощи следующей команды:
# ps -A
Для получения идентификатора конкретного процесса можно воспользоваться командой pidof, которой в качестве аргумента задается его имя.
# pidof mysqld 1684
Также можно сделать фильтрацию с помощью grep
# ps aux | grep mysqld root 1582 0.0 0.0 5116 1408 ? S 09:49 0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql mysql 1684 0.1 0.5 136884 21844 ? Sl 09:49 1:09 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock root 20844 0.0 0.0 4356 740 pts/0 S+ 21:39 0:00 grep mysqld
Примеры
Прежде чем перейти непосредственно к исполнению команды kill, следует сделать ряд важных замечаний:
- Пользователь может прервать любой свой процесс.
- Пользователь не может прервать процесс другого пользователя..
- Суперпользователь (root) может прервать системный процесс и процесс любого пользователя.
- Пользователь не может прервать системный процесс
Чтобы “убить” процесс с указанным PID, нужно выполнить следующую команду (приведен пример для процесса mysqld из предыдущего раздела):
# kill -9 1684
Будет “убит” процесс с PID=1684, то есть mysqld.
Можно использовать не только номер, но и название сигнала/ Например, для запроса на прерывание, который можно обработать или проигнорировать:
# kill -SIGTERM 1684
Аналогично, команда kill -SIGKILL PID эквивалентна команде # kill -9 PID
Для прерывания нескольких процессов можно указать их идентификаторы через пробел:
# kill PID1 PID2 PID3
или
# kill -9 PID1 PID2 PID3
или
# kill -SIGKILL PID1 PID2 PID3
Прерывание процесса по имени. Команда pkill
Для прерывания процесса по имени, а не идентификатору, используется команда pkill. Нужно внимательно вводить имя процесса, так как прерывание не того процесса может привести к сбоям:
# pkill mysqld
Если у процесса слишком много экземпляров и дочерних процессов, существует команда killall, которой в качестве аргумента также задается имя процесса.
# killall [сигнал или опция] имя процесса
Для прерывания всех экземпляров mysqld с дочерними процессами воспользуйтесь следующей командой:
# killall mysqld
Далее можно проверить состояние процесса (запущен он или нет), например:
# service mysql status
Команда killall
Еще одна полезная команда для завершения процессов, это команда killall. Эта команда также как и pkill может завершить все процессы имеющие одно имя
killall mysqld
А также весьма полезна бывает когда нужно завершить все процессы какого нибудь пользователя.
killall -u username
Заключение
Мы разобрали, как прерывать процессы в Linux и рассмотрели несколько используемых для этого команд. Эти команды следует применять с большой осторожностью, так как неосмотрительное прерывание процесса может привести к системным сбоям или потере важных данных. Для более подробной информации, различных вариантов передаваемых сигналов и других опций можно обратиться к соответствующим man-страницам.