Командная строка Linux, процессы: команды jobs, fg, bg, ps, pgrep, kill, pkill, htop

Командная строка Linux, процессы: команды jobs, fg, bg, ps, pgrep, kill, pkill, htop

Обновлено 23.02.2024

Приветствую!

Сегодня поговорим про важную и неотъемлемую часть операционной системы – процессы. В этой заметке мы рассмотрим следующие консольные команды: jobs, fg, bg, ps, pgrep, kill, pkill, htop.

Присоединяйтесь к нашему каналу: t.me/r4ven_me и чату: t.me/r4ven_me_chat в Telegram .

Все примеры из этой статьи были выполнены в консоли дистрибутива Debian 12, установку и запуск которого я подробно описывал в статье: Установка сервера Debian 12 в VirtualBox.

Почти во всех остальных дистрибутивах Linux все будет выглядеть аналогично.

Также рекомендую к прочтению другие статьи из цикла по командной строке Linux.

Немного теории

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

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

Процессы в Linux могут находиться в различных состояниях, например:

  • Запущенные (Running) – процесс активно выполняется на процессоре;
  • Ожидающие (Waiting) – процесс ожидает какого-либо события, такого как завершение ввода/вывода;
  • Остановленные (Stopped) – процесс приостановлен и не выполняется, но может быть возобновлен;
  • Зомби (Zombie) – процесс, завершивший выполнение, но еще не был полностью удален из системы. Зомби возникают, когда родительский процесс не обрабатывает событие завершения своего дочернего процесса;
  • Вызываемые (Runnable) – процессы, готовые к выполнению, но ожидающие своей очереди на процессоре;
  • и другие.

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

Процессы, запущенные в текущей оболочке

Давайте рассмотрим ситуацию с процессами, запущенными в текущем сеансе командной оболочки.

Для этого открываем программу-терминал в нашем Linux’е и выполняем, например, такую команду:

sleep 500 &

Для примера мы использовали команду sleep 500, которая отправляет процесс в ожидание на указанное количество времени, в данном случае 500 секунд.

*Эту команду часто используют для осуществления задержки перед выполнением других команд и не только. Сейчас же мы ее использовали лишь в качестве демонстрации.

Оператор & (амперсанд) в конце строки отправляет указанную до него команду выполняться в фоновом режиме, тем самым освобождая текущий сеанс командной строки для дальнейшей работы. Подробнее про этот и другие операторы контроля выполнения команд я рассказывал в статье: Командная строка Linux, контроль выполнения команд: операторы «&&», «||», «;» и «&».

Обратите внимание на информационное сообщение с цифрами – в квадратных скобках указан номер (id) процесса в текущем сеансе оболочки (так называемый job_spec), а более длинный номер сообщает нам id процесса (PID) в общесистемном списке процессов (об этом чуть позже).

Команда jobs

Для работы с фоновыми процессами в ткущем сеансе нам понадобиться команда jobs.

Описание:

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

Синтаксис:

jobs [ключи] [id_процесса]

Часто используемые ключи:

  • -l: – выводит подробную информацию о фоновых задачах, включая их статус (процесс остановлен или запущен) и номер задачи;
  • -p – выводит только идентификаторы процессов (PIDs) фоновых задач;
  • -s – выводит только фоновые задачи в состоянии остановки (stopped);
  • -r – выводит только фоновые задачи в состоянии запущенного выполнения (running).

Чтобы посмотреть текущие фоновые процессы выполним в терминале:

jobs

Видим, что у нас есть один выполняемый процесс (Запущен/Running) и команда, которая его инициировала.

Команда fg

Для дальнейшей работы, с запущенным ранее процессом воспользуемся командой fg (foreground).

Описание:

Команда fg продолжает выполнение последней приостановленной (остановленной) задачи на переднем плане.

Синтаксис:

fg [id_процесса]

Давайте вернем наш фоновый процесс на передний план такой командой:

fg %1

%1 – это аргумент команды fg, содержащий номер локального процесса (job_spec, начинается со знака %), который мы хотим вывести на передний план. Номер процесса мы узнали с помощью команды jobs (в квадратных скобках).

Теперь данный процесс вернулся на “передний план” и занял нашу оболочку.

Чтобы прервать его выполнение можно отправить процессу один из специальных сигналов. Например, сочетанием клавиш Ctrl+c активному процессу отправится сигнал SIGINT, который, чаще всего, завершает работу процесса.

Но давайте отправим этот процесс в “сон”, с помощью сочетания клавиш Ctrl+z, которое отправляет процессу сигнал SIGTSTP (Terminal Stop Signal):

Процесс остановил свою работу, но не завершился. Он просто находится в ожидании.

Команда bg

Следующей командой, которой мы воспользуемся для возобновления остановленного фонового процесса – команда bg (background).

Описание:

Команда bg продолжает выполнение последней приостановленной (остановленной) задачи в фоновом режиме.

Синтаксис:

bg [id_процесса]

И так наш процесс “спит” и не выполняется. Чтобы вернуть его к жизни можно вновь вывести его на передний план командой fg или же отправить выполняться в фоне командой bg. Попробуем второй вариант.

bg %1

Проверим результат командой jobs, затем выведем процесс на передний план командой fg и завершим его сочетанием клавиш Ctrl+c:

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

Системные процессы

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

Команда ps

Для просмотра таких процессов используется команда ps (processes).

Описание:

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

Синтаксис:

ps [ключи]

Часто используемые ключи:

  • -e – показать все активные процессы в системе;
  • -f – вывести полный формат вывода с дополнительными подробностями;
  • -u <username> – показать процессы только для указанного пользователя;
  • -p <PID> – вывести информацию о процессе с указанным PID;
  • --forest – показать древовидную структуру процессов;
  • -o <format> – настроить формат вывода, выбирая поля для отображения;
  • --sort=-%cpu – сортировать процессы по использованию процессора (по убыванию);
  • --sort=-%mem – сортировать процессы по использованию памяти (по убыванию).
  • Ключи в стиле BSD (без дефиса):
    • a – показать процессы, связанные с терминалом;
    • u – вывести дополнительные сведения о пользователе, создавшем процесс;
    • x – показать процессы, не связанные с терминалом, то есть демоны.

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

Запустим парочку локальных процессов и после выполним команду ps:

sleep 1000 &

ping 8.8.8.8 > /dev/null &

ps

Суть команды ps заключается в том, что она делает снимок запущенных процессов (snapshot) на момент их выполнения и выводит этот список в стандартный вывод.

В нашем случае виден список процессов запущенных в текущем сеансе и их process id (PID) в общесистемном списке процессов.

В списке также есть: процесс нашего сеанса оболочки – bash, фоновые команды sleep и ping, а также сама команда ps, которая на момент показа “снимка” процессов также находилась в этом списке.

Чтобы увидеть список всех системных процессов можно передать команде ps три аргумента: aux:

ps aux

Вывод может быть очень длинным, поэтому для построчного просмотра можно перенаправить вывод ps команде less, которую мы разбирали в статье Командная строка Linux, вывод и чтение содержимого: команды echo, cat, less.

Внизу списка мы найдем и наши, запущенные локально, процессы:

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

Например, выведем список с указанием “потомства” процессов:

ps ux --forest

Также можно вывести список процессов с их сортировкой, например по потреблению памяти:

ps aux --sort=-%mem

Команда pgrep

Для более быстрого и удобного поиска нужного процесса я регулярно пользуюсь командой pgrep. В качестве аргумента ей можно передать имя (или часть имени) искомого процесса и если таковой существует, команда выведет о нём информацию. Обратите внимание, что команда чувствительна к регистру.

Описание:

Команда pgrep в Linux используется для поиска и вывода идентификаторов процессов, соответствующих заданным критериям.

Синтаксис:

pgrep [ключи] <шаблон_поиска>

Часто используемые ключи:

  • -a – выводит информацию о командной строке, с которой был запущен процесс;
  • -f – выводит полную информацию о процессах;
  • -l – выводит идентификаторы процессов вместе с их именами;
  • -u <username> – отбирает процессы, принадлежащие указанному пользователю;
  • -x – делает поиск точным, ищет процесс по полному совпадению имени;
  • -n – ограничивает вывод указанным количеством идентификаторов;
  • -o – выводит только идентификатор самого старшего (старейшего по времени создания) процесса.

Если использовать pgrep без ключей, то она выведет только PID процесса:

pgrep sleep

Но если добавить пару полезных ключей, например -a и -f (или -af), команда pgrep будет искать процессы, а также выводить полную информацию о них, включая имена команд и дополнительные детали:

Команда pstree

Также хочу отметить еще одну полезную команду – pstree.

Описание:

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

Синтаксис:

pstree [ключи] [PID | USER]

Часто используемые ключи:

  • -p – выводит идентификаторы процессов (PIDs) вместе с именами процессов;
  • -u <username> – отображает дерево процессов только для указанного пользователя;
  • -a – показывает аргументы командной строки, с которой были запущены процессы.

В Linux Mint 21 данная команда установлена из коробки. Но в минимальном варианте Debian 12 она отсутствует, но легко устанавливается командой:

sudo apt install psmisc

При ее выполнении в стандартный вывод отправляется снимок списка активных процессов в виде “дерева”. Это позволяет более наглядно изучить связи родительских и дочерних процессов:

pstree

Сервер Debian 12:

Linux Mint 21:

Заметная разница, не правда ли? Особенно учитывая то, что на скриншоте из Linux Mint весь вывод просто не поместился)

Завершение и “убийство” процессов

Запускать процессы мы умеем, давайте научимся их завершать, корректно и не очень)

Для завершения работы процесса в Linux ему отправляется специальный сигнал.

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

Вот список часто используемых сигналов:

  • SIGTERM (15): Стандартный сигнал завершения. Посылается процессу с просьбой завершиться. Процесс может обработать этот сигнал и выполнить необходимые действия перед завершением. Данный сигнал является сигналом по умолчанию у команд завершения. Например, если выполнить kill без указания кода сигнала, будет использован сигнал -15.
  • SIGKILL (9): Жесткий сигнал завершения. Процесс будет немедленно завершен, и его ресурсы освобождены. Процесс не может игнорировать или перехватывать этот сигнал.
  • SIGINT (2): Сигнал прерывания. Обычно генерируется при нажатии Ctrl+C в терминале. Позволяет процессу “уйти красиво”, выполнив необходимые действия перед завершением.
  • SIGHUP (1): Сигнал завершения при отключении терминала (hang up). Часто используется для перезапуска демонов и сервисов (например для перечитывания конфига nginx, apache).
  • SIGSTOP (19) и SIGCONT (18): Сигналы приостановки и продолжения выполнения процесса. SIGSTOP останавливает процесс, а SIGCONT возобновляет его выполнение. Аналогично действиям клавиш Ctrl+z и команде fg из примеров выше.
  • SIGTSTP (20): Сигнал приводит к тому, что процесс приостанавливается и переходит в состояние остановки (Suspended). Данный сигнал отправляется клавишей Ctrl+z, нажатой во время выполнения процесса на переднем плане.
  • и еще много других.

Команда kill

Чтобы отправить сигнал процессу в Linux существует множество способов. Один из самых популярных – это команда kill.

Описание:

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

Синтаксис:

kill [ключи] [сигнал] <id_процесса>
  • сигнал можно передавать в виде кода, например -15, а также его полным или сокращенным названием, например SIGKILL или KILL.
  • Под id_процесса подразумевается как его локальный id, выводимый командой jobs, так и PID процесса в общесистемном списке.

Часто используемые ключи:

  • -l или --list – вывести список доступных сигналов. Каждый сигнал имеет номер и имя.

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

Давайте для эксперимента запустим несколько фоновых процессов:

sleep 1000 &

ping 8.8.8.8 > /dev/null &

sleep 100 && ls -l && sleep 1000 &

Теперь давайте отправим несколько сигналов нашим локальным процессам с помощью команды kill:

kill -2 %1

kill -15 %2

kill -9 1127

Первой командой мы отправили SIGINT процессу с номером 1 в текущей сессии, второй командой сигнал SIGTERM второму локальному процессу и третьей командой мы отправили SIGKILL третьему локальному процессу, но с указанием его PID.

В выводе консоли можно увидеть сообщения о прерывании, завершении и “убийстве” указанных процессов)

Команда pkill

Существует также команда pkill, которая в качестве аргумента принимает не PID процесса а его имя (или часть имени). Данная команда имеет схожие с командой pgrep назначения ключей, но не все.

Описание:

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

Синтаксис:

pkill [ключи] [сигнал] <шаблон_поиска>

Часто используемые ключи:

  • -e – включить сопоставление с именем процесса полностью, включая командную строку;
  • -f – выполнить поиск по всей командной строке, а не только по имени процесса;
  • -u <username> – завершить процессы только для указанного пользователя;
  • -x – выполнить точный поиск, учитывая полное совпадение имени процесса;
  • -n – ограничить количество завершаемых процессов;
  • -l – вывести список доступных сигналов;
  • -o – завершить только старший (самый старый по времени запуска) процесс.

Например, запустим 3 процесса командой sleep:

sleep 300 &

sleep 500 &

sleep 1000 &

ps -af

Теперь давайте отправим сигнал завершения SIGTERM (-15) с помощью команды pkill. Напоминаю, что данный сигнал используется в командах завершения сигналом по умолчанию:

pkill sleep

Как видно, команда нашла все процессы, в имени которых присутствует ключевое слово “sleep” и завершила их.

Чтобы завершить конкретный процесс по указанной команде, нужно добавить ключ -f, а искомую команду/имя процесса взять в кавычки:

sleep 333 &

pkill -f 'sleep 333'

Для передачи другого сигнала, например SIGKILL просто указываем соответствующий код:

sleep 555 &

pkill -9 -f 'sleep 555'

Команде pkill для указания сигнала можно передать его имя вместо кода, например так:

pkill -KILL sleep

Консольный диспетчер процессов – htop

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

Описание:

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

Синтаксис:

htop [ключи]

Часто используемые ключи:

  • -d <seconds> – задать интервал обновления в секундах;
  • -u <username> – показать только процессы указанного пользователя;
  • -p <PID> – отслеживать только указанный процесс;
  • -s <COLUMN> – сортировать список процессов по указанной колонке;
  • -t – показать процессы в древовидной структуре;
  • -H – показать отдельные потоки вместе с процессами;
  • -M – сортировать процессы по использованию памяти;
  • -P – сортировать процессы по использованию процессора.

htop – это улучшенная версия минималистичного диспетчера top, который, к слову, почти во всех дистрибутивах Linux устанавливается из коробки. В сравнении с top у htop более широкий функционал по отображении и фильтрации процессов, а также удобочитаемый вид + цветное оформление.

Утилита htop не предустановлена ни в Linux Mint ни в Debian 12. Но она всегда доступна в стандартных репозиториях.

Установим её:

sudo apt install htop

И запустим:

htop

Диспетчер имеет удобную навигацию с помощью стрелок на клавиатуре, а также вызов функций с помощью F* клавиш (смотрите подсказки внизу окна htop).

Например, при нажатии клавиши F5 можно отобразить процессы в виде дерева:

Также процессы можно фильтровать по имени, завершать, менять их приоритет.

Давайте прибьем парочку висящих процессов sleep.

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

После выбора нужного сигнала и нажатия Enter он отправится указанному процессу.

Также интересной особенностью htop является возможность конфигурации внешнего вида по умолчанию. Но это уже тонкости.

Вообще диспетчеры процессов это тема для отдельного поста) возможно сделаю его в будущем.

Выводы

В данной статье мы бегло рассмотрели возможности работы с процессами в Linux из командной строки. Мы поговорили про процессы, запущенные в текущем сеансе оболочки, разобрали работу команд: jobs, fg, bg.

Затем мы познакомились со способами просмотра системных процессов. Тут мы использовали команды: ps, pgrep, pstree.

После чего мы научились отправлять различные сигналы запущенным процессам, в т.ч. сигналы на завершение их работы.

Также немного изучили популярный консольный диспетчер процессов – htop.

Тема процессов в Linux является очень обширной. Суть этой статьи – овладеть минимальными навыками работы с процессами из командной строки Linux. Несмотря на это, материал получился объемный, из-за чего некоторые темы пришлось исключить. Например, подробный разбор состояний процессов или уровень их уступчивости/приоритета (nice). Эти темы я рекомендую вами изучить самостоятельно. Ссылки на все источники вы найдёте ниже)

Спасибо, что читаете! Успехов вам в администрировании ваших жизненных процессов)

Если возникли вопросы, смело задавай их в нашем чате телеграм.

Полезные источники

Подписаться
Уведомить о
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии