Основы завершения процессов Linux с использованием ps, pgrep, pkill и других

Управление процессами в Linux может показаться запутанным для нового системного администратора (sysadmin) на первый взгляд. Но с небольшим объяснением и демонстрацией вы узнаете, что нахождение и завершение процессов в Linux – это просто вопрос использования инструментов командной строки, таких как ps и kill.

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

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

Предварительные требования

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

  • A Linux host, which can be a virtual machine or a physical machine.
  • Чтобы попробовать примеры PowerShell, установите PowerShell 7.1.1 на хосте Linux.
  • A non-root user account. While root access is not required, there will be an example where the root user can kill the running process of another user.

Выбор дистрибутива Linux, который вы хотите использовать, зависит от вас. В этой статье будет использоваться Ubuntu 20.04 LTS. Однако команды являются стандартными для операционной системы Linux.

Готовы начать? Хорошо, приступим.

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

Время от времени вы можете столкнуться с ситуацией, когда вам нужно остановить запущенный процесс в системе Linux. Например, у вас может быть скрипт bash, который запускается по расписанию. Этот скрипт настроен на запуск от имени другого пользователя с помощью задания cron (планировщик процессов Linux).

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

В следующих разделах вы узнаете о командах, используемых для поиска и завершения или убийства процессов в системе Linux. Каждый раздел будет строиться на предыдущем. Вы узнаете о командах ps, top, pgrep, kill и pkill, все они являются встроенными в Linux.

В качестве бонуса включены эквивалентные команды PowerShell Get-Process и Stop-Process, если вам не нравятся встроенные команды Linux.

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

Перед тем, как убить процесс, вам необходимо найти правильный процесс для цели. Уникальный идентификатор PID позволяет точно нацелиться. Читайте дальше, чтобы узнать, как найти правильные процессы для завершения.

Использование команды ps для отображения информации о процессах

Команда ps или Статус процесса отображает информацию о активных процессах в системе Linux. Вы можете найти выполняющийся процесс и даже фоновые процессы с помощью ps.

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

ps
Displaying processes matching the EUID (effective user ID) for the user bkindle.

Поиск расширенной информации о процессе с использованием команды top

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

При выполнении команды top вы увидите не только идентификатор процесса (PID). Вместе с деталями процесса отображаются проценты CPU и памяти, значения Nice (приоритет процесса планирования CPU) и приоритет процесса (PR), установленный ядром Linux.

Для нового или опытного системного администратора команда top часто является основным инструментом для управления основными системными ресурсами и процессами. Как показано ниже, вывод команды top отображает больше информации о процессе, чем команда ps, включая общие системные метрики.

The top command on Ubuntu Desktop 20.04 LTS showing all running PID’s.

htop – это улучшенный вариант top, который включает различные улучшения, такие как цветной вывод в терминале.

Предположим, вы хотите проверить, какие ресурсы по памяти или ЦП использовал процесс. В этом случае вы можете использовать ключ p команды top, как показано ниже.

top -p 2113
The top command displaying information on only one PID, 2113.

Возможно, вам нужно отобразить все запущенные процессы для определенного имени пользователя. Команда top предлагает ключ u, чтобы отобразить только процессы определенного пользователя. Как показано в примере ниже, отображаются только идентификаторы процессов, соответствующие идентификатору пользователя bkindle.

top -u bkindle
The top command displaying only processes for the user bkindle.

Нахождение конкретных идентификаторов процессов с помощью команды pgrep

Изначально команда для Solaris, pgrep была портирована для использования в Linux. Объединяя поиск силы команды grep и управления процессами команды ps, pgrep предлагает гибкость в поиске точного процесса для цели.

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

pgrep vmtoolsd
Using pgrep to obtain all PIDs associated with vmtoolsd.

Аналогично, чтобы получить только процессы, связанные с определенным пользователем, укажите идентификатор пользователя с помощью параметра u. Как показано ниже, для пользователя bkindle и процесса vmtoolsd возвращается только один идентификатор процесса PID.

pgrep -u bkindle vmtoolsd
Retrieving the specific PID for the vmtoolsd process associated with the user bkindle.

Поиск процессов с помощью Get-Process в PowerShell в Linux

Обычные команды Linux работают прекрасно, но вы знали, что PowerShell также способен управлять процессами в Linux? Команда Get-Process работает аналогично команде Linux ps и возвращает информацию о процессах. Например, возможно, вам нужно найти все запущенные процессы текущего пользователя bkindle. Как показано ниже, найдите все идентификаторы процессов (обозначаются как ID в Get-Process) пользователя bkindle.

Get-Process -IncludeUserName |
	Where-Object {$_.UserName -eq 'bkindle'} |
	Select-Object -Property 'Id','UserName','ProcessName'
Retrieving Linux PID’s with PowerShell’s Get-Process cmdlet.

Связано: Как использовать команду PowerShell Where-Object для фильтрации всего

Изучив различные способы определения процессов, продолжайте чтение, чтобы узнать все способы завершения или прерывания процесса в Linux!

Завершение процессов с помощью команд Kill в Linux

В предыдущих разделах вы узнали, как определить идентификатор процесса (PID), к которому вы хотите отправить сигнал kill, с использованием нативных команд Linux и PowerShell. В следующих разделах будет объяснено, как использовать программы kill и pkill, их ассоциированные сигналы и параметры командной строки.

Сигналы Linux и управление процессами

Сигналы – это метод, которым Linux общается с процессами, работающими в операционной системе. Три основных сигнала, которые использует команда kill для завершения процессов, следующие:

  • 1 (SIGHUP) – Завершает интерактивные программы и заставляет демоны (фоновые службы) перечитывать файлы конфигурации, используемые процессом.
  • 9 (SIGKILL) – Принудительно завершает процесс без выполнения задач по грациозному завершению.
  • 15 (SIGTERM) – Позволяет процессу завершиться грациозно, например, закрывая открытые файлы по окончании. Этот сигнал используется по умолчанию, когда при использовании команды kill не указывается номер.

Хотя в этой статье рассматриваются только три основных сигнала, используемых для завершения процессов, всего доступно 64 сигнала. Используйте команду kill -l, чтобы получить список сигналов и соответствующих им номеров.

Great video on understanding process signals

Теперь, когда вы понимаете три основных сигнала, используемых для завершения процесса, узнайте, как завершить процесс в следующих разделах.

Использование команды kill для завершения процесса

В следующем примере вы будете использовать команду kill. Представьте на мгновение, что вы запускаете экземпляр PowerShell с именем pwsh и присвоенным PID 22687. Один из способов завершения этого процесса показан ниже.

  1. Используйте pgrep pwsh, чтобы определить PID процесса pwsh, используемый в команде kill.
  2. Используйте команду kill -s TERM 22687, чтобы завершить процесс pwsh грациозно. Команда TERM соответствует сигналу 15 (SIGTERM) и указывается с помощью параметра s команды kill.
  3. Используйте команду top, ps или pgrep по вашему выбору, чтобы убедиться, что PID больше не отображается.

Ниже приведен пример вышеуказанного процесса из терминала bash Ubuntu 20.04 LTS.

Using kill and associated commands to terminate the pwsh process.

Команда killall завершит все процессы по имени, а не по PID, что может привести к непредсказуемым последствиям, если использовать эту команду небрежно. Однако, если вы все же решите использовать эту команду, используйте опцию i, чтобы команда запрашивала подтверждение.

Завершение процессов по имени с помощью команды pkill

Возможно, вы заметили, что команда kill работает только с идентификаторами процессов. Это может сделать завершение процесса сложным многоэтапным процессом. Команда pkill , включенная в пакеты procps и procps-ng, завершает процесс на основе его имени.

Функционально команда pkill выступает оберткой для программы pgrep. Команда pkill отправляет заданный сигнал каждому найденному процессу вместо простого перечисления PID в терминале. Отличие pkill от kill заключается в том, что pkill может использовать только имя процесса, а не его PID.

Команда pkill по умолчанию не доступна в Ubuntu 20.04 LTS. Вам необходимо скачать и установить данное приложение. Для этого выполните команду sudo apt install mcollective-plugins-process -y.

Для завершения процесса с помощью команды pkill выполните следующие действия:

  1. Используйте команду ps, чтобы убедиться, что приложение nano (текстовый редактор командной строки) в данный момент выполняется. Этот шаг является необязательным, но предосторожностью перед завершением процесса.
  2. Используйте команду pkill -9 nano для принудительного завершения приложения nano.

Ниже приведен пример вышеуказанного процесса из терминала bash Ubuntu 20.04 LTS.

Using the pkill command to forcefully terminate the nano process.

Завершение процесса с помощью команды top

При выполнении команды top для просмотра текущих процессов вы можете завершить определенный процесс, нажав клавишу k. Появится интерактивное сообщение, запрашивающее PID процесса для завершения.

Как показано ниже, выполните команду top и нажмите клавишу k. Введите PID, который вы хотите завершить, и нажмите клавишу Enter, чтобы немедленно завершить процесс.

Use top to specify a process to terminate using the k keystroke.

Затем изучите еще одну альтернативу использования нативных команд Linux с помощью команды PowerShell Stop-Process!

Использование команды PowerShell Stop-Process для завершения процесса

Если нативные команды Linux не по вашему вкусу, существует решение в PowerShell! Как и с помощью команды kill, вы можете завершить процессы с помощью Stop-Process в Linux. Еще раз, представьте, что вы запускаете процесс PowerShell pwsh.

  1. Найдите идентификатор PID с помощью команды Get-Process -ProcessName 'pwsh' и запишите идентификаторы PID для завершения.
  2. Используйте Stop-Process -Id 29992,30014, чтобы завершить несколько возвращенных процессов.
  3. Используйте Get-Process -ProcessName 'pwsh' и проверьте идентификаторы PID, 29992 и 30014 больше не отображаются, что означает, что они были завершены.

Вы также можете использовать Get-Process и метод kill для завершения одного или нескольких процессов: (Get-Process -Id [PID]).Kill() или (Get-Process -Id [PID1,2,3,4]).Kill().

Будьте осторожны при использовании параметра ProcessName. Использование этого параметра аналогично команде killall и приведет к завершению всех процессов, соответствующих указанным именам.

Ниже приведен пример вышеуказанного процесса из терминала bash Ubuntu 20.04 LTS.

Using PowerShell, Stop-Process to kill processes in Linux.

Следующие шаги

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

Связано: Парень из мира Windows в мире Linux: Настройка SSH в Linux

Source:
https://adamtheautomator.com/linux-kill-process/