Процессы 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 исчез.

Что важно запомнить

Источники