Home » Команда ps в Linux — обзор процессов
Команда ps в Linux — обзор процессов

Команда ps в Linux — обзор процессов

Если вы работаете с Linux-серверами, то команда `ps` — это ваш хлеб насущный. Она позволяет заглянуть внутрь системы и увидеть, что происходит с процессами прямо сейчас. Независимо от того, настраиваете ли вы VPS или администрируете выделенный сервер, понимание того, как работают процессы, критически важно для диагностики проблем, оптимизации производительности и обеспечения стабильности системы.

В этой статье мы разберём команду `ps` от базовых принципов до продвинутых техник. Вы узнаете, как быстро найти проблемный процесс, настроить мониторинг и автоматизировать рутинные задачи. Поехали!

Как работает команда ps

Команда `ps` (process status) читает информацию о процессах из виртуальной файловой системы `/proc`. Каждый запущенный процесс в Linux имеет свой каталог в `/proc/[PID]`, где хранятся различные данные о процессе: статус, потребление памяти, открытые файлы и многое другое.

Основные форматы вывода `ps`:

  • BSD-стиль — без дефисов (например, `ps aux`)
  • System V стиль — с дефисами (например, `ps -ef`)
  • GNU длинные опции — с двойными дефисами (например, `ps –forest`)

Базовые команды ps — быстрый старт

Начнём с самых полезных команд, которые нужны в повседневной работе:


# Показать все процессы с подробной информацией
ps aux

# Показать процессы в виде дерева
ps axjf

# Показать только процессы текущего пользователя
ps u

# Показать процессы с полным форматом
ps -ef

# Показать процессы конкретного пользователя
ps -u username

# Показать процессы по имени
ps -C process_name

Расшифровка вывода ps aux

Команда `ps aux` — это классика. Вот что означают столбцы:

Столбец Описание Пример
USER Пользователь, запустивший процесс root, www-data
PID Идентификатор процесса 1234
%CPU Процент использования CPU 0.5
%MEM Процент использования памяти 2.1
VSZ Виртуальная память (KB) 123456
RSS Физическая память (KB) 45678
TTY Терминал, связанный с процессом pts/0, ?
STAT Состояние процесса S, R, Z
START Время запуска 10:30
TIME Суммарное время CPU 0:05
COMMAND Команда запуска /usr/bin/nginx

Коды состояний процессов

Столбец STAT показывает текущее состояние процесса. Основные коды:

  • R — Running (выполняется)
  • S — Sleeping (спит, ожидает события)
  • D — Uninterruptible sleep (неприрывный сон, обычно I/O)
  • Z — Zombie (зомби-процесс)
  • T — Stopped (остановлен)
  • I — Idle (бездействует)

Дополнительные модификаторы:

  • < — высокий приоритет
  • N — низкий приоритет
  • L — страницы заблокированы в памяти
  • s — лидер сессии
  • l — многопоточный
  • + — процесс в группе переднего плана

Продвинутые техники фильтрации

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


# Найти процессы nginx
ps aux | grep nginx

# Показать только процессы с высоким потреблением CPU
ps aux --sort=-%cpu | head -10

# Показать процессы, потребляющие больше всего памяти
ps aux --sort=-%mem | head -10

# Показать процессы конкретного пользователя с сортировкой
ps -u www-data --sort=-rss

# Показать процессы с заданным форматом
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem

# Показать только определённые столбцы
ps -eo pid,user,comm,pcpu,pmem

Мониторинг проблемных процессов

Вот несколько практических сценариев для диагностики проблем:

Поиск зомби-процессов


# Найти все зомби-процессы
ps aux | awk '$8 ~ /^Z/ { print $2 }' | wc -l

# Показать зомби с родительскими процессами
ps -eo pid,ppid,stat,comm | grep Z

Анализ потребления ресурсов


# Топ-10 процессов по CPU
ps aux --sort=-%cpu | head -11

# Топ-10 процессов по памяти
ps aux --sort=-%mem | head -11

# Суммарное потребление памяти процессами пользователя
ps -u www-data -o pid,rss,comm --no-headers | awk '{sum+=$2} END {print "Total RSS:", sum, "KB"}'

Поиск долгоживущих процессов


# Процессы, запущенные больше суток назад
ps -eo pid,etime,comm | grep -E "^[[:space:]]*[0-9]+[[:space:]]+[0-9]+-"

Автоматизация и скрипты

Команда `ps` отлично подходит для автоматизации. Вот несколько полезных скриптов:

Скрипт мониторинга нагрузки


#!/bin/bash
# monitor_load.sh

echo "=== CPU Usage ==="
ps aux --sort=-%cpu | head -6

echo -e "\n=== Memory Usage ==="
ps aux --sort=-%mem | head -6

echo -e "\n=== Zombie Processes ==="
zombies=$(ps aux | awk '$8 ~ /^Z/ { print $2 }' | wc -l)
echo "Zombie count: $zombies"

if [ $zombies -gt 0 ]; then
ps aux | awk '$8 ~ /^Z/ { print $2, $11 }'
fi

Автоматическое завершение проблемных процессов


#!/bin/bash
# kill_high_mem.sh

THRESHOLD=80 # Процент памяти
HIGH_MEM_PROCS=$(ps aux | awk -v threshold=$THRESHOLD '$4 > threshold && $11 !~ /^(kernel|kthreadd)/ {print $2}')

for pid in $HIGH_MEM_PROCS; do
echo "Killing high memory process: $pid"
kill -TERM $pid
done

Генерация отчётов


#!/bin/bash
# process_report.sh

DATE=$(date '+%Y-%m-%d %H:%M:%S')
echo "Process Report - $DATE"
echo "================================="

echo "Top 5 CPU consumers:"
ps aux --sort=-%cpu | head -6 | tail -5

echo -e "\nTop 5 Memory consumers:"
ps aux --sort=-%mem | head -6 | tail -5

echo -e "\nProcess count by user:"
ps aux --no-headers | awk '{count[$1]++} END {for(user in count) print user, count[user]}' | sort -k2 -nr

Интеграция с другими утилитами

Команда `ps` прекрасно работает в связке с другими инструментами:

С watch для мониторинга в реальном времени


# Обновление каждые 2 секунды
watch -n 2 'ps aux --sort=-%cpu | head -10'

# Мониторинг конкретного процесса
watch -n 1 'ps -p 1234 -o pid,pcpu,pmem,comm'

С awk для обработки данных


# Подсчёт процессов по состоянию
ps aux | awk 'NR>1 {count[substr($8,1,1)]++} END {for(state in count) print state, count[state]}'

# Среднее потребление CPU по пользователям
ps aux | awk 'NR>1 {cpu[$1]+=$3; count[$1]++} END {for(user in cpu) print user, cpu[user]/count[user]}'

С системными вызовами


# Найти процесс и проследить системные вызовы
PID=$(ps aux | grep nginx | grep -v grep | awk '{print $2}' | head -1)
strace -p $PID

# Открытые файлы процесса
lsof -p $PID

Альтернативы и современные решения

Хотя `ps` остаётся классикой, есть более современные альтернативы:

Инструмент Преимущества Недостатки
htop Интерактивный, цветной, удобный Нужно устанавливать отдельно
atop Детальная статистика, исторические данные Сложнее в использовании
glances Современный интерфейс, веб-версия Требует Python
systemd (systemctl) Интеграция с сервисами Только для systemd-систем

Установка альтернатив


# Ubuntu/Debian
sudo apt install htop atop glances

# CentOS/RHEL
sudo yum install htop atop python3-pip
pip3 install glances

# Arch Linux
sudo pacman -S htop atop glances

Интересные факты и малоизвестные возможности

Несколько интересных фактов о команде `ps`:

  • Процесс с PID 1 всегда init (или systemd в современных системах)
  • Команда `ps` без параметров показывает только процессы текущего терминала
  • Символ `?` в TTY означает, что процесс не привязан к терминалу (daemon)
  • Время в TIME — это суммарное время CPU, а не время работы процесса

Нестандартные способы использования


# Показать процессы как дерево с ASCII-графикой
ps axjf

# Показать процессы с переменными окружения
ps eww

# Показать нити (threads) процесса
ps -T -p PID

# Показать процессы в формате JSON (с jq)
ps aux | tail -n +2 | awk '{print "{\"user\":\""$1"\", \"pid\":"$2", \"cpu\":"$3", \"mem\":"$4", \"command\":\""$11"\"}"}' | jq

# Мониторинг изменений в процессах
ps aux | sort > /tmp/ps1.txt
sleep 10
ps aux | sort > /tmp/ps2.txt
diff /tmp/ps1.txt /tmp/ps2.txt

Производительность и оптимизация

При работе с большими системами важно помнить о производительности:

  • Используйте фильтры — не выводите все процессы, если нужны только определённые
  • Ограничивайте вывод — используйте `head` или `tail` для больших списков
  • Кешируйте результаты — для скриптов, которые вызывают `ps` часто


# Эффективный поиск процесса
ps -C nginx -o pid,cmd

# Вместо
ps aux | grep nginx

# Быстрый подсчёт процессов
ps ax --no-headers | wc -l

# Мониторинг с минимальной нагрузкой
ps -eo pid,pcpu,pmem,comm --sort=-%cpu | head -5

Решение типичных проблем

Проблема: Система медленно работает


# Найти процессы с высоким CPU
ps aux --sort=-%cpu | head -10

# Проверить I/O wait
ps aux | awk '$8 ~ /D/ { print $2, $11 }'

Проблема: Заканчивается память


# Найти процессы-пожиратели памяти
ps aux --sort=-%mem | head -10

# Подсчитать суммарное потребление по процессам
ps aux --no-headers | awk '{sum+=$6} END {print "Total RSS:", sum/1024, "MB"}'

Проблема: Много зомби-процессов


# Найти родительские процессы зомби
ps -eo pid,ppid,stat,comm | awk '$3 ~ /Z/ {print "Zombie PID:", $1, "Parent PID:", $2}'

# Убить родительский процесс (осторожно!)
kill -TERM parent_pid

Безопасность и ограничения

Важно помнить о безопасности при использовании `ps`:

  • Параметры командной строки могут содержать пароли и токены
  • Переменные окружения (`ps e`) могут раскрывать секреты
  • Не все процессы видны обычным пользователям


# Безопасный способ поиска процесса с секретными данными
ps aux | grep -v grep | grep process_name | awk '{print $2}' | head -1

# Скрыть параметры командной строки
ps aux | awk '{print $1, $2, $11}' | grep target_process

Заключение и рекомендации

Команда `ps` — это фундаментальный инструмент для любого системного администратора. Она позволяет быстро диагностировать проблемы, мониторить производительность и автоматизировать рутинные задачи.

Основные рекомендации:

  • Изучите базовые команды: `ps aux`, `ps -ef`, `ps axjf`
  • Используйте сортировку и фильтрацию для эффективного поиска
  • Автоматизируйте мониторинг с помощью скриптов
  • Комбинируйте `ps` с другими инструментами для полного анализа
  • Помните о безопасности при работе с чувствительными данными

Для серьёзных проектов рекомендую настроить VPS или выделенный сервер с достаточными ресурсами для комфортной работы с процессами и их мониторингом.

Команда `ps` останется актуальной ещё долгие годы. Освоив её в совершенстве, вы значительно повысите свою эффективность как системного администратора. Практикуйтесь, экспериментируйте и не бойтесь комбинировать её с другими инструментами — именно так рождаются элегантные решения сложных задач.


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

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

Leave a reply

Your email address will not be published. Required fields are marked