Процессы Linux: PID, ps, top и дерево запуска
Процесс — запущенный экземпляр программы со своим PID, памятью, открытыми файлами, identity и связью с родителем. Для диагностики важно отличать имя исполняемого файла от конкретного процесса и видеть не только нагрузку, но и состояние.
PID, PPID и команда
ps делает снимок таблицы процессов. Явный формат надёжнее привычного набора колонок конкретной системы.
ps -eo pid,ppid,user,state,etime,%cpu,%mem,comm,args --sort=-%cpu | head
printf 'current shell pid=%s parent=%s\n' "$$" "$PPID"comm — короткое имя, args — командная строка, которую процесс может изменить и которая способна содержать чувствительные аргументы. Секреты не следует передавать в argv.
PPID помогает восстановить причину запуска: worker мог быть дочерним процессом service manager, shell или контейнерного runtime. pstree -p, если установлен, показывает это дерево наглядно; те же связи доступны через колонки ps.
Состояние процесса
В поле state R означает выполняющийся или готовый к CPU процесс, S — прерываемое ожидание, D — непрерываемое ожидание ядра, T — остановку, Z — zombie. Большое число sleeping процессов само по себе не является проблемой.
pid=$$
grep -E '^(Name|State|Pid|PPid|Threads):' "/proc/$pid/status"
ls -l "/proc/$pid/fd" 2>/dev/null | head/proc/PID существует только пока жив процесс и отражает его текущую картину. Между чтениями PID может исчезнуть — это нормальная гонка наблюдения.
Интерактивный обзор через top
top регулярно обновляет CPU, память, load average и задачи. Сначала смотрите на интервал наблюдения и сортировку. Короткий CPU spike может исчезнуть, а накопленное время процесса не равно текущей загрузке. Для воспроизводимого отчёта используйте batch-режим, если он поддерживается: top -b -n 1.
Ошибка и диагностика
Поиск через ps aux | grep app часто находит сам grep и не различает два одноимённых процесса. Используйте pgrep -a -f 'точный шаблон', данные service manager или PID-файл с проверкой start time. Перед вмешательством подтвердите PID, пользователя, PPID и полную команду. Высокий load не означает только CPU: процессы в D могут ждать I/O.
Практика
Запустите sleep 120 &, сохраните PID через $!, найдите его PID/PPID/state/elapsed time в ps и /proc/PID/status. Постройте цепочку родителей до текущего shell. Затем корректно завершите процесс и убедитесь, что каталог в proc исчез.
Что важно запомнить
- PID идентифицирует живой процесс только в данный момент; после завершения номер переиспользуется.
- PPID и дерево запуска часто объясняют, кто должен управлять процессом.
- CPU, память, state и I/O-нужно рассматривать вместе, а не по одной колонке top.