- Home »

Команда 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` останется актуальной ещё долгие годы. Освоив её в совершенстве, вы значительно повысите свою эффективность как системного администратора. Практикуйтесь, экспериментируйте и не бойтесь комбинировать её с другими инструментами — именно так рождаются элегантные решения сложных задач.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.