Введение


Linux — это семейство Unix-подобных операционных систем, основанных на одном ядре. Они известны своей устойчивостью и стабильностью, но даже в таких системах могут возникать проблемы с программами. Иногда программы начинают зависать, нестабильно отвечать или вообще перестают работать. Это может проявляться в медленной реакции на команды, невозможности закрыть программу обычным способом или перезапустить ее, так как исходный процесс приложения не завершается окончательно.

Обычно первым решением в такой ситуации является перезагрузка системы. Однако есть и другой способ — использование команд kill и killall для «убийства» запущенной программы. В этой статье мы подробно рассмотрим, как правильно использовать эти команды для решения проблем с зависшими или нестабильными программами в Linux.

Процесс — это любая выполняющаяся программа. Другими словами, это функционирующий экземпляр программы. Если вы запустили два окна с одним и тем же приложением, это будут два разных процесса, а не один.

Понимание PID процесса в Linux

Linux каждый процесс имеет уникальный идентификатор, называемый Process ID (PID). Когда система создает новый процесс, ему автоматически присваивается PID, который является уникальным в рамках данной системы. Этот идентификатор позволяет различать процессы и управлять ими, включая возможность завершения работы или приостановки.

Родительские и дочерние процессы в Linux: Управление жизненным циклом процессов

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

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

Возможные значения PID

В зависимости от значения PID, которое мы будем передавать команде kill, сигнал будет отправляться разным группам процессов. Давайте подробнее рассмотрим, как значение PID влияет на отправку сигнала:

  • PID > 0. Сигнал будет послан процессу, чей идентификатор соответствует введенному значению.
  • PID = 0. Все процессы, входящие в текущую группу, получают этот сигнал.
  • PID = −1. В этом случае сигнал будет послан всем пользовательским процессам (если команду вызывает root, то сигнал идет всем процессам кроме init и самого kill). Для этого существует специальный идентификатор пользователя (UID).
  • PID < −1. Сигнал отправляется процессам, включенным в группу с GID (идентификатор группы), соответствующим абсолютному значению PID.

PID (Process ID) — это уникальный идентификатор процесса в операционной системе. Он используется для идентификации и управления процессами.

В Linux вы можете найти PID процесса несколькими способами:

  1. Использование команды ps:
ps aux | grep process_name

Здесь process_name — это имя процесса, который вы хотите найти. Команда ps aux выводит список всех процессов, а grep фильтрует результаты, оставляя только те строки, которые содержат process_name.

2. Использование команды top:

Команда top показывает список самых ресурсоемких процессов в системе. Вы можете найти нужный процесс, прокручивая список вверх или вниз.

3. Использование команды pgrep:

pgrep process_name

4. Использование команды journalctl: Если процесс запускался через систему инициализации systemd, вы можете использовать команду journalctl для просмотра логов процесса. В логах часто указывается PID процесса.

5. Использование команды lsof: Команда lsof (list open files) показывает список всех открытых файлов и процессов, которые их используют. Вы можете использовать эту команду для поиска процессов, которые открывают определенные файлы или устройства.

 

 

 

Команда kill

еперь, когда мы знаем PID процесса, мы можем принудительно остановить его, используя команду kill и передав ей номер PID:

kill 120

Команда kill по умолчанию отправляет сигнал SIGTERM, который сообщает процессу о необходимости завершения работы и дает возможность остановиться без ошибок. Однако сигнал может быть проигнорирован. Для гарантированного прерывания работы процесса без риска игнорирования можно отправить сигнал SIGKILL (номер 9), который немедленно прерывает процесс.

kill −9 120

 

С помощью kill можно убивать сразу несколько процессов. Для этого указываем их PID подряд через пробел:

kill −9 987 875 992

 

Утилита pkill

pkill — это оболочка для команды kill, которая позволяет использовать регулярные выражения или другие критерии для поиска процессов. Она имеет такой же синтаксис, как и kill, но вместо PID можно передать имя процесса (или часть его имени). Утилита работает, просматривая директорию /proc и находя идентификатор первого процесса с подходящим именем, после чего отправляет этому процессу сигнал SIGTERM.

pkill firefox

 

Команда killall

Команда killall в Linux используется для одновременного завершения всех процессов, которые соответствуют указанному имени. Она аналогична команде pkill, но вместо использования регулярных выражений для поиска процессов, killall ищет процессы по точному совпадению имени.Например, если у вас есть несколько экземпляров процесса с именем myapp, вы можете использовать команду killall myapp для их одновременного убийства

killall gcalctool

Без аргументов killall также отправляет сигнал SIGTERM. Для отправки другого сигнала нужно явно это прописать:

killall -s 1 gcalctool

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

man killall

Как проверить, что процесс убит

Чтобы убедиться, что процесс был действительно отменен, надо воспользоваться одним из способов:

ps aux | grep
pidof
pgrep

При успешном окончании эти команды ничего не выведут.

Подробности о завершении процессов

Права пользователя root

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

Чтобы прервать любой процесс (неважно, был ли он запущен пользователем root или любым другим пользователем), kill и killall должны быть выполнены от суперпользователя. Например, в Ubuntu это делается добавлением слова sudo:

sudo kill 980

Также только у root есть права на отмену процесса системного уровня.

Использование виртуальной консоли

Допустим, вам необходимо остановить зависнувший процесс, но у вас не получается открыть терминал. Тогда стоит зайти в виртуальную консоль, нажав клавиши Ctrl + Alt + F1, авторизоваться (ввести логин и пароль) и исполнить скрипт из нее. Чтобы перейти обратно, нужно применить Ctrl + Alt + F7.

Отправка сигналов в Linux

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

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

  • SIGINT (2) — самый безопасный сигнал для отмены процесса. После этого процесс правильно завершается, и управление возвращается. Также его можно отправить с помощью клавиш Ctrl + C.
  • SIGQUIT (3) — этот сигнал также сообщает программе об окончании. Программа либо выполняет корректное завершение, либо игнорирует сигнал. В отличие от SIGINT, этот сигнал генерирует содержимое рабочей памяти одного процесса. Можно послать с помощью клавиатуры, используя сочетание Ctrl + /.
  • SIGHUP (1) перезагружает процесс, а также используется для перезагрузки файлов конфигурации и открытия или закрытия файлов журнала. Чаще посылается системой при потере соединения с интернетом и сообщает процессу об отсутствии связи с управляющим терминалом.

Чтобы процесс завершился верно, порты и сокеты освобождаются и закрываются, а также удаляются временные файлы. Поэтому не стоит использовать сразу радикальные меры — передавать SIGKILL. Сначала пытаемся завершить процесс в следующем рекомендуемом порядке:

  1. SIGINT (Ctrl + C).
  2. SIGTERM — аккуратно останавливает процесс.
  3. SIGKILL — последнее средство для завершения.

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

  1. Номер (-1 или -s 1).
  2. Полное название (-SIGHUP или -s SIGHUP).
  3. Сокращенное название, без префикса «SIG» (-HUP или -s HUP).

Настройка процессов

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

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

Теперь воспользуемся командой cat, которая последовательно считывает содержимое файла и записывает его в стандартный поток вывода:

cat /var/run/nginx.pid

После этого мы увидим искомый PID. Теперь осталось обновить настройки, написав:

sudo kill −1 749

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

Управление приоритетами процессов

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

Для контроля приоритетов у Linux есть понятие вежливости. Самые приоритетные задачи считаются менее вежливыми, потому что они не делятся ресурсами. Тогда процессы с низким приоритетом считаются более вежливыми, потому им требуется минимум ресурсов.

В выводе команды top есть столбец NI, целью которого является отобразить значение вежливости. Вежливость может варьироваться от −20 (наибольший приоритет) до 20 (соответственно, наименьший).

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

nice -n 10

А для того чтобы изменить значение вежливости у уже выполняемой программы, воспользуемся инструментом renice, которому передаем PID:

renice 11

Заключение

Команды kill и killall являются мощными инструментами в Linux, позволяющими администраторам прекращать выполнение запущенных процессов. Они играют важную роль в администрировании Linux и применяются в различных сценариях, включая прекращение работы процессов, вызов перезапуска служб и многое другое.

Хотя эти команды очень эффективны, важно быть осторожным при их использовании, поскольку неправильное применение может привести к удалению данных и неожиданным последствиям. Поэтому рекомендуется тщательно изучить руководство по использованию этих команд, чтобы убедиться, что они применяются правильно и безопасно.

От root

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

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