Глиф Учебники

Урок 6. Процессы: ps, top, kill и фоновые задачи

Курс «Командная строка Linux» · урок 6 из 10 · 4 минуты чтения

Каждая запущенная программа — это процесс. У процесса есть номер — PID (process ID), владелец (пользователь, от которого он работает) и родитель — процесс, который его запустил. Когда вы набираете ls, оболочка запускает процесс ls, ждёт его завершения и снова показывает приглашение. Номер самой оболочки показывает echo $$.

ps — список процессов

Bash
ps
ps aux
ps aux | grep nginx
pgrep -a nginx

Главные столбцы ps aux:

СтолбецЧто значит
USERвладелец процесса
PIDномер процесса
%CPU, %MEMдоля процессора и памяти
STATсостояние: R — работает, S — ждёт, Z — зомби, T — остановлен
COMMANDкоманда, которой процесс запущен

В выводе ps aux | grep nginx почти всегда есть строка и с самим grep nginx — это ваша команда поиска, её не учитывайте. pgrep такой строки не показывает.

Самые «тяжёлые» процессы — сортировка по памяти или по процессору:

Bash
ps aux --sort=-%mem | head -n 6
ps aux --sort=-%cpu | head -n 6

top и htop — живая картина

top показывает процессы и обновляет список каждые несколько секунд:

Клавиша в topДействие
Pсортировать по процессору
Mсортировать по памяти
1загрузка каждого ядра отдельно
kзавершить процесс: спросит PID и сигнал
qвыйти

В первой строке top — load average, три числа: средняя нагрузка за 1, 5 и 15 минут. Грубо говоря, это сколько процессов в среднем хотят работать одновременно. Сравнивайте её с числом ядер (его показывает nproc): нагрузка 4 на четырёх ядрах — полная загрузка, на восьми — половина.

htop — то же самое, но нагляднее: цветные полосы загрузки, прокрутка, мышь. Обычно его ставят отдельно — в Ubuntu, Debian и Mint это sudo apt install htop. В htop F3 — поиск, F6 — сортировка, F9 — завершить процесс, F10 или q — выход.

Сигналы и kill

Процесс завершают, посылая ему сигнал. Команда так и называется — kill:

Bash
kill 4321
kill -9 4321
pkill firefox
killall firefox

Порядок такой: сначала обычный kill, подождать несколько секунд, и только если процесс жив — kill -9. Свои процессы можно завершать без sudo, чужие и системные — только через sudo.

команда сигнал что происходит с процессом 4321 kill 4321 SIGTERM · 15 сохраняет данные и закрывается сама через несколько секунд процесс ещё жив kill -9 4321 SIGKILL · 9 система обрывает сразу, данные могут испортиться
kill 4321 посылает SIGTERM, и программа закрывается сама, сохранив данные; если процесс жив, kill -9 посылает SIGKILL, и система обрывает его сразу.

kill -9 не даёт программе сохранить данные: файлы, которые она записывала, могут остаться испорченными. Не обрывайте так базы данных и установку программ (apt, dpkg). Службы останавливайте командой sudo systemctl stop имя — иначе система может сразу запустить их снова.

pkill fire завершит все процессы, в имени которых есть «fire». Сначала посмотрите список: pgrep -a fire.

Список всех сигналов — kill -l. Кроме TERM и KILL полезен HUP: многие службы по kill -HUP PID перечитывают настройки без перезапуска — но не все, это сказано в документации конкретной программы.

Фоновые задачи

Обычно оболочка ждёт, пока команда закончится. Если поставить в конце &, команда уйдёт в фон, а приглашение сразу вернётся:

Терминал
$ sleep 300 &
[1] 4821

[1] — номер задачи в этой оболочке, 4821 — PID. PID последней фоновой задачи хранится в переменной $!. Управление задачами:

Bash
jobs
fg %1
bg %1
kill %1

Частый приём: запустили долгую команду без &, а терминал нужен. Нажмите Ctrl+Z, потом bg — команда продолжит работу в фоне.

sleep 300 sleep 300 & передний план терминал занят командой фон команда работает, приглашение свободно остановлена стоит на паузе fg %1 Ctrl+Z bg %1
Команда без & занимает терминал, с & уходит в фон; Ctrl+Z ставит команду на паузу, bg %1 продолжает её в фоне, а fg %1 возвращает на передний план.

Чтобы команда пережила закрытие терминала

Фоновая задача всё ещё привязана к терминалу. Когда окно закрывается или обрывается соединение SSH, оболочка получает сигнал SIGHUP и рассылает его своим задачам — обычно они завершаются. Варианты:

Bash
nohup ./backup.sh > backup.log 2>&1 &

nohup запускает команду так, что SIGHUP её не трогает. Вывод лучше сразу направить в файл: иначе nohup пишет его в nohup.out. Если команда уже запущена в фоне, отвязать её от терминала можно командой disown.

окно закрыто или SSH оборвался SIGHUP bash оболочка sleep 300 & обычно завершается nohup ./backup.sh > backup.log 2>&1 & работает дальше вывод — в файл backup.log
Когда окно терминала закрывается, bash получает SIGHUP и рассылает его фоновым задачам: обычная задача завершается, а запущенная через nohup работает дальше.

Для долгой работы на сервере удобнее tmux или screen: они держат целый терминал, к которому можно отключиться и потом вернуться. А программы, которые должны работать всегда (сайт, бот), запускают как службы systemd — они переживают и выход, и перезагрузку. Подробнее — в справке Как запустить команду в фоне.

Коротко

Проверьте себя

1. Чем kill PID отличается от kill -9 PID?
2. Вы запустили долгую команду и хотите вернуть себе терминал, не прерывая её. Что сделать?
3. Почему в выводе ps aux | grep nginx есть строка с grep nginx?
4. Что делает nohup в команде nohup ./backup.sh > backup.log 2>&1 &?