Введение: зачем управлять процессами?
Каждая запущенная программа в Linux — это процесс. Управление ими — одна из ключевых задач системного администратора и разработчика. Нужно ли вам:
- Найти и завершить "зависший" процесс, который съедает всю память?
- Узнать, какой именно процесс слушает сетевой порт?
- Запустить задачу в фоне, чтобы закрыть терминал?
- Настроить автозапуск важного сервиса?
Этот гайд покрывает всё — от базовых команд ps и kill до современного менеджера системных сервисов systemd. Вы получите практические навыки, которые пригодятся ежедневно.
Базовый мониторинг: ps, top и htop
Команда ps — снимок процессов
ps (process status) показывает статический список процессов на момент запуска команды.
Самые полезные варианты:
# Показать все процессы всех пользователей в "полном" формате (BSD-стиль)
ps aux
Ключевые столбцы:
USER— владелец процесса.PID— уникальный идентификатор процесса (главное, что нужно для управления).%CPU,%MEM— потребление процессорного времени и памяти.COMMAND— команда, запустившая процесс.
# Альтернативный, более детальный формат (POSIX-стиль)
ps -ef
Здесь столбцы: UID, PID, PPID (PID родителя), C (коэффициент использования CPU), STIME (время запуска), CMD.
Фильтрация: Всегда комбинируйте ps с grep для поиска.
ps aux | grep nginx
ps -ef | grep python3
⚠️ Важно:
grepсам появится в выводе. Используйтеpgrepдля чистого поиска по имени:pgrep -l nginx.
top и htop — интерактивный мониторинг
top — классическая утилита, которая обновляет список процессов в реальном времени (по умолчанию каждые 3 секунды).
Основные клавиши в top:
P— сортировка по загрузке CPU (по умолчанию).M— сортировка по использованию памяти.N— сортировка по PID.k— убить процесс (запросит PID и сигнал).r— изменить приоритет (renice) процесса.u— показать процессы только указанного пользователя.q— выйти.
htop — более удобная и наглядная цветовая альтернатива top. Она часто не установлена по умолчанию, но её стоит установить (sudo apt install htop / sudo yum install htop). Позволяет управлять процессами прямо из интерфейса (F9 для kill, F5 для дерева, F6 для сортировки).
Поиск процессов: не только по имени
Иногда нужно найти процесс не по его имени, а по другим признакам.
По открытому порту или сокету
Частая задача: "Кто слушает порт 80?".
# Рекомендуемый современный способ (из пакета iproute2)
sudo ss -tulpn | grep :80
Опции: -t (TCP), -u (UDP), -l (только слушающие), -p (показать процесс/программу).
# Классический способ (из пакета net-tools)
sudo lsof -i :80
lsof (list open files) показывает все открытые файлы, включая сетевые сокеты. Очень мощный инструмент.
По файлу или каталогу
Какой процесс держит открытым файл /var/log/app.log и мешает его удалить?
sudo lsof /var/log/app.log
По дереву процессов
Чтобы увидеть иерархию (родительские и дочерние процессы), используйте:
pstree -p
Или в htop нажмите F5.
Завершение процессов: kill, killall, pkill
Сигналы: язык общения с процессами
Завершение — это не просто "выстрел". Это отправка сигнала — короткого сообщения процессу. Основные:
| Сигнал | Номер | Действие (по умолчанию) | Как использовать |
|---|---|---|---|
SIGTERM | 15 | Вежливое завершение. Процесс может обработать сигнал, сохранить состояние и корректно закрыться. | kill <PID> (этот сигнал отправляется по умолч.) |
SIGKILL | 9 | Немедленное принудительное завершение. Обработчик сигнала игнорируется. Процесс не может сохранить данные. | kill -9 <PID> или kill -KILL <PID> |
SIGINT | 2 | Прерывание (как Ctrl+C в терминале). | kill -2 <PID> |
SIGHUP | 1 | "Перезагрузка". Часто используется для перечитывания конфигурационных файлов без полного перезапуска. | kill -HUP <PID> |
Правило: Сначала пробуйте SIGTERM (просто kill). Если процесс не реагирует (виснет), используйте SIGKILL.
Инструменты
kill <PID>— отправитьSIGTERMконкретному PID.kill -s SIGNAL <PID>илиkill -SIGNAL <PID>— отправить конкретный сигнал. Пример:kill -HUP 1234.killall <имя_процесса>— завершить все процессы с указанным именем.killall nginx. Осторожно! Убедитесь, что убиваете то, что нужно.pkill <паттерн>— завершить процессы, соответствующие шаблону (по имени, пользователю и т.д.).pkill -f "python3 script.py"(ищет в полной командной строке). Мощный, но требует аккуратности.pgrep <паттерн>— только найти PID по шаблону. Идеально для комбинации:kill $(pgrep -f "python3 script.py").
Управление приоритетами: nice и renice
Linux планировщик распределяет время CPU между процессами. Приоритет можно влиять.
nice— запускает процесс с заданным статическим приоритетом.- Диапазон: от
-20(наивысший приоритет, требуетsudo) до+19(наинизший). - Пример запуска с низким приоритетом (чтобы не мешал другим задачам):
nice -n 19 ./долгая_расчётная_задача.sh - Если не указать
-n, по умолчанию используется+10.
- Диапазон: от
renice— меняет приоритет уже запущенного процесса.# Повысить приоритет (уменьшить значение nice) для PID 5678 sudo renice -5 -p 5678
💡 Совет: Не повышайте (
nice < 0) приоритет важных системных процессов без необходимости. Это может привести к "голоданию" других задач.
Фоновые процессы и управление заданиями
Простое фоновое выполнение
Добавьте & в конец команды:
long_running_command &
[1] 2345 # [1] - номер задания, 2345 - PID
Команда вернёт управление терминалу сразу.
Управление заданиями (job control)
jobs— показать список фоновых заданий текущей оболочки.fg %1— вернуть задание №1 на передний план (foreground).bg %1— возобновить остановленное задание №1 в фоне (background).Ctrl+Z— приостановить (stop) текущий foreground-процесс (не завершает!).
Независимость от терминала: nohup и disown
По умолчанию фоновый процесс (&) всё равно "привязан" к терминалу. Если терминал закроется (например, разорвётся SSH-соединение), процесс получит сигнал SIGHUP и, скорее всего, завершится.
nohup(no hang up) — запускает процесс, игнорирующий сигналSIGHUP.
Вывод перенаправляется в файлnohup ./my_server.py > server.log 2>&1 &server.log.disown— после запуска процесса в фоне (command &) можно "отсоединить" его от текущей оболочки:disown %1. После этого процесс не будет получатьSIGHUPпри закрытии терминала.
Современный подход: systemd и systemctl
Для долгоживущих системных сервисов (веб-серверы, базы данных, демоны) в современных дистрибутивах (Ubuntu 15.04+, CentOS 7+, Debian 8+) используется systemd.
Основные команды systemctl
# Статус сервиса (запущен ли, PID, последние логи)
sudo systemctl status nginx
# Запуск/остановка/перезапуск
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx # мягкий перезапуск (может отключить на мгновение)
sudo systemctl reload nginx # перечитать конфиг без остановки (если поддерживает)
# Включение/отключение автозапуска при загрузке системы
sudo systemctl enable nginx
sudo systemctl disable nginx
# Просмотр всех юнитов (сервисов, таймеров, сокетов)
systemctl list-units --type=service --all
# Просмотр логов сервиса (аналог journalctl)
sudo journalctl -u nginx -f # -f — следить в реальном времени
Создание собственного сервиса
- Создайте файл конфигурации:
sudo nano /etc/systemd/system/myapp.service - Базовый шаблон:
[Unit] Description=Мой кастомный сервис After=network.target [Service] Type=simple ExecStart=/usr/bin/python3 /opt/myapp/main.py Restart=on-failure User=appuser WorkingDirectory=/opt/myapp [Install] WantedBy=multi-user.target - Активируйте:
sudo systemctl daemon-reload && sudo systemctl enable --now myapp.service.
Продвинутый мониторинг и анализ
strace — трассировка системных вызовов
Если нужно понять, что именно делает "зависший" процесс, используйте strace. Он показывает все взаимодействия процесса с ядром (чтение/запись файлов, сетевые запросы и т.д.).
# Трассировать уже запущенный процесс
sudo strace -p <PID> -o trace.log
# Запустить команду под strace
sudo strace -o trace.log ./my_program
Используйте -c для статистики по системным вызовам, -f для следования за дочерними процессами.
lsof — "что открыто?"
Уже упоминалась, но стоит выделить отдельно. Это швейцарский нож для анализа.
# Все открытые файлы для конкретного PID
sudo lsof -p <PID>
# Все сетевые соединения (аналог netstat)
sudo lsof -i
# Кто держит каталог /mnt/backup (например, для unmount)
sudo lsof +D /mnt/backup
vmstat и iostat — общая нагрузка на систему
Чтобы понять, проблема в процессе или в системе в целом:
# Процессы, память, своп, I/O, CPU (обновляется каждые 2 сек)
vmstat 2
# Статистика по дисковому вводу-выводу
iostat -xz 2
Если vmstat показывает высокий wa (I/O wait) — проблема в дисках. Если высокий us/sy (user/system CPU) — проблема в процессах.
Заключение и лучшие практики
- Начинайте с
ps auxилиtop/htopдля общего обзора. - Используйте
grep/pgrep/pkillдля поиска, но проверяйте вывод передkillall. - Отправляйте
SIGTERM(kill) в первую очередь,SIGKILL(-9) — только в крайнем случае. - Для сервисов используйте
systemctl, а не ручной запуск через&. Это даст автоматический перезапуск, логирование и управление. nohupиdisown— ваши друзья для долгих задач в нестабильном SSH-сессии.straceиlsof— мощные отладочные инструменты для глубокого анализа.- Права: Для управления чужими процессами (особенно через
killилиrenice) часто нужны праваsudo.
Управление процессами — это навык, который оттачивается практикой. Экспериментируйте в тестовой среде, создавайте "игрушечные" зависшие процессы (sleep 1000 &) и отрабатывайте на них команды.