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

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

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

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

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

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

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

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

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

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

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

BASH
sleep 500 &
Нажмите, чтобы развернуть и увидеть больше

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

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

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

Команда jobs

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

Описание:

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

Синтаксис:

BASH
jobs [ключи] [id_процесса]
Нажмите, чтобы развернуть и увидеть больше

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

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

BASH
jobs
Нажмите, чтобы развернуть и увидеть больше

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

Команда fg

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

Описание:

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

Синтаксис:

BASH
fg [id_процесса]
Нажмите, чтобы развернуть и увидеть больше

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

BASH
fg %1
Нажмите, чтобы развернуть и увидеть больше

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

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

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

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

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

Команда bg

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

Описание:

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

Синтаксис:

BASH
bg [id_процесса]
Нажмите, чтобы развернуть и увидеть больше

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

BASH
bg %1
Нажмите, чтобы развернуть и увидеть больше

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

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

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

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

Команда ps

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

Описание:

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

Синтаксис:

BASH
ps [ключи]
Нажмите, чтобы развернуть и увидеть больше

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

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

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

BASH
sleep 1000 &

ping 8.8.8.8 > /dev/null &

ps
Нажмите, чтобы развернуть и увидеть больше

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

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

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

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

BASH
ps aux
Нажмите, чтобы развернуть и увидеть больше

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

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

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

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

BASH
ps ux --forest
Нажмите, чтобы развернуть и увидеть больше

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

BASH
ps aux --sort=-%mem
Нажмите, чтобы развернуть и увидеть больше

Команда pgrep

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

Описание:

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

Синтаксис:

BASH
pgrep [ключи] <шаблон_поиска>
Нажмите, чтобы развернуть и увидеть больше

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

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

BASH
pgrep sleep
Нажмите, чтобы развернуть и увидеть больше

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

Команда pstree

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

Описание:

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

Синтаксис:

BASH
pstree [ключи] [PID | USER]
Нажмите, чтобы развернуть и увидеть больше

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

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

BASH
sudo apt install psmisc
Нажмите, чтобы развернуть и увидеть больше

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

BASH
pstree
Нажмите, чтобы развернуть и увидеть больше

Сервер Debian 12:

Linux Mint 21:

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

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

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

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

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

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

Команда kill

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

Описание:

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

Синтаксис:

BASH
kill [ключи] [сигнал] <id_процесса>
Нажмите, чтобы развернуть и увидеть больше

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

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

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

BASH
sleep 1000 &

ping 8.8.8.8 > /dev/null &

sleep 100 && ls -l && sleep 1000 &
Нажмите, чтобы развернуть и увидеть больше

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

BASH
kill -2 %1

kill -15 %2

kill -9 1127
Нажмите, чтобы развернуть и увидеть больше

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

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

Команда pkill

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

Описание:

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

Синтаксис:

BASH
pkill [ключи] [сигнал] <шаблон_поиска>
Нажмите, чтобы развернуть и увидеть больше

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

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

BASH
sleep 300 &

sleep 500 &

sleep 1000 &

ps -af
Нажмите, чтобы развернуть и увидеть больше

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

BASH
pkill sleep
Нажмите, чтобы развернуть и увидеть больше

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

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

BASH
sleep 333 &

pkill -f 'sleep 333'
Нажмите, чтобы развернуть и увидеть больше

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

BASH
sleep 555 &

pkill -9 -f 'sleep 555'
Нажмите, чтобы развернуть и увидеть больше

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

BASH
pkill -KILL sleep
Нажмите, чтобы развернуть и увидеть больше

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

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

Описание:

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

Синтаксис:

BASH
htop [ключи]
Нажмите, чтобы развернуть и увидеть больше

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

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

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

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

BASH
sudo apt install htop
Нажмите, чтобы развернуть и увидеть больше

И запустим:

BASH
htop
Нажмите, чтобы развернуть и увидеть больше

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

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

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

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

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

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

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

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

Выводы

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

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

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

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

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

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

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

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

Авторские права

Автор: Иван Чёрный

Ссылка: https://r4ven.me/linux/komandnaya-stroka-linux-processy-komandy-jobs-fg-bg-ps-pgrep-kill-pkill-htop/

Лицензия: CC BY-NC-SA 4.0

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

Начать поиск

Введите ключевые слова для поиска статей

↑↓
ESC
⌘K Горячая клавиша