Урок 6. Процессы: ps, top, kill и фоновые задачи
Каждая запущенная программа — это процесс. У процесса есть номер — PID (process ID), владелец (пользователь, от которого он работает) и родитель — процесс, который его запустил. Когда вы набираете ls, оболочка запускает процесс ls, ждёт его завершения и снова показывает приглашение. Номер самой оболочки показывает echo $$.
ps — список процессов
ps
ps aux
ps aux | grep nginx
pgrep -a nginxpsбез ключей — только процессы текущего терминала;ps aux— все процессы системы;ps aux | grep nginx— только строки, где есть «nginx»;pgrep -a nginx— номера и команды процессов, в имени которых есть «nginx».
Главные столбцы ps aux:
| Столбец | Что значит |
|---|---|
USER | владелец процесса |
PID | номер процесса |
%CPU, %MEM | доля процессора и памяти |
STAT | состояние: R — работает, S — ждёт, Z — зомби, T — остановлен |
COMMAND | команда, которой процесс запущен |
В выводе ps aux | grep nginx почти всегда есть строка и с самим grep nginx — это ваша команда поиска, её не учитывайте. pgrep такой строки не показывает.
Самые «тяжёлые» процессы — сортировка по памяти или по процессору:
ps aux --sort=-%mem | head -n 6
ps aux --sort=-%cpu | head -n 6top и 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:
kill 4321
kill -9 4321
pkill firefox
killall firefoxkill PIDпосылает SIGTERM (номер 15) — вежливую просьбу завершиться. Программа успевает сохранить данные и закрыться сама.kill -9 PIDпосылает SIGKILL — система обрывает процесс мгновенно, программа ничего не успевает.pkill имяиkillall имязавершают процессы по имени, а не по номеру.
Порядок такой: сначала обычный kill, подождать несколько секунд, и только если процесс жив — kill -9. Свои процессы можно завершать без sudo, чужие и системные — только через sudo.
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 последней фоновой задачи хранится в переменной $!. Управление задачами:
jobs
fg %1
bg %1
kill %1jobs— список фоновых и остановленных задач этого терминала;fg %1— вернуть задачу 1 на передний план;Ctrl+Z— остановить (приостановить) команду, которая работает на переднем плане;bg %1— продолжить остановленную задачу в фоне;kill %1— завершить задачу по её номеру.
Частый приём: запустили долгую команду без &, а терминал нужен. Нажмите Ctrl+Z, потом bg — команда продолжит работу в фоне.
Чтобы команда пережила закрытие терминала
Фоновая задача всё ещё привязана к терминалу. Когда окно закрывается или обрывается соединение SSH, оболочка получает сигнал SIGHUP и рассылает его своим задачам — обычно они завершаются. Варианты:
nohup ./backup.sh > backup.log 2>&1 &nohup запускает команду так, что SIGHUP её не трогает. Вывод лучше сразу направить в файл: иначе nohup пишет его в nohup.out. Если команда уже запущена в фоне, отвязать её от терминала можно командой disown.
Для долгой работы на сервере удобнее tmux или screen: они держат целый терминал, к которому можно отключиться и потом вернуться. А программы, которые должны работать всегда (сайт, бот), запускают как службы systemd — они переживают и выход, и перезагрузку. Подробнее — в справке Как запустить команду в фоне.
Коротко
- Процесс — запущенная программа, PID — его номер.
ps aux— все процессы,pgrep -a имя— поиск по имени,topиhtop— живая картина.kill PID— вежливо (SIGTERM),kill -9 PID— силой (SIGKILL),pkill имя— по имени.команда &— в фон;jobs,fg,bg,Ctrl+Z— управление задачами.nohup,disown, tmux — чтобы команда пережила закрытие терминала.