1. Управление процессами и сигналами
Управление процессами и сигналами
Почему ваш сервер вдруг начал «тормозить», хотя нагрузка по htop вроде бы небольшая? Часто причина — не в нехватке ресурсов, а в одном-единственном процессе, который вошел в неразрешимое состояние или потребляет не те ресурсы. Глубокое понимание управления процессами — это не просто умение делать kill, а навык диагностики и точечного хирургического вмешательства в работу системы.
Любой запущенный код в Linux — это процесс. У каждого есть уникальный числовой идентификатор PID. Посмотреть список процессов можно через ps aux или в интерактивном режиме через top/htop. Но для управления важнее другие инструменты.
Управление жизненным циклом: сигналы Сигналы — это асинхронные уведомления, которые ядро или пользователь отправляют процессу. Это основной механизм управления. Самые важные сигналы:
| Сигнал | Число | Действие | Типичный сценарий |
| :--- | :--- | :--- | :--- |
| SIGTERM (15) | 15 | Корректное завершение | Стандартная остановка сервиса (systemctl stop) |
| SIGKILL (9) | 9 | Принудительное завершение | Процесс не реагирует на SIGTERM |
| SIGHUP (1) | 1 | Перечитать конфигурацию | Перезапуск демона без остановки (nginx -s reload) |
| SIGSTOP (19) | 19 | Приостановить (freeze) | Пауза ресурсоемкой задачи |
| SIGCONT (18) | 18 | Возобновить | Продолжение приостановленной задачи |
Отправить сигнал можно командой kill. Например, kill -9 1234 отправит SIGKILL процессу с PID 1234. Но как найти этот PID? Для этого есть pgrep и pkill. pgrep -f "python server.py" найдет PID по строке в команде запуска, а pkill -f "python server.py" сразу отправит ему сигнал SIGTERM.
> Важно: SIGKILL — это последний resort. Он не позволяет процессу завершиться gracefully: сохранить данные, закрыть соединения, освободить ресурсы. Сначала всегда пробуйте SIGTERM.
Управление приоритетами: nice и renice Не все процессы равны. Приоритет процесса определяет, какую долю CPU он получит в конкуренции с другими. Уровень приоритета называется nice value и диапазон от -20 (最高优先级) до 19 (最低优先级). Значение по умолчанию — 0.
Запустить процесс с измененным приоритетом можно через nice. Например, тяжелый расчет, который не должен мешать другим задачам:
Изменить приоритет уже запущенного процесса можно через renice:
Повысить приоритет (сделать nice value отрицательным) может только суперпользователь (root). Это ключевой инструмент, если нужно временно отдать приоритет критичному сервису, потеснив фоновые задачи.
Управление сессиями и задачами: fg, bg, jobs, nohup
Когда вы запускаете команду в интерактивном терминале, она становится частью сессии и группы процессов. Если вы нажмете Ctrl+C, сигнал SIGINT получит вся группа. Это можно обойти.
Запустите долгую задачу с & в конце: ./long_script.sh &. Она уйдет в фон. Вернуть её на передний план можно командой fg %1 (где 1 — номер задачи из вывода jobs). Отправить обратно в фон — командой bg %1.
Но что будет, если вы закроете терминал? Все дочерние процессы получат SIGHUP и завершатся. Чтобы этого избежать, используйте nohup (no hangup):
Теперь процесс продолжит работу даже после выхода из сессии. Для более сложных сценариев (управление демонами, логирование, автоматический перезапуск) используются системные менеджеры вроде systemd, но nohup остается быстрым и простым решением для разовых задач.
Продвинутый инструмент: strace
Если процесс ведет себя странно, но не падает, полезно посмотреть, какие системные вызовы он делает. Для этого есть strace. Он прикрепляется к процессу и показывает поток вызовов ядра.
Эта команда покажет только сетевые операции и операции записи для процесса 1234. Это мощнейший инструмент отладки: вы можете увидеть, что процесс застрял в ожидании ввода-вывода, пытается подключиться к несуществующему ресурсу или пишет в неожиданный файл.
В итоге, управление процессами — это не просто kill. Это комбинация сигналов, приоритетов и контроля над окружением выполнения. Владея этими инструментами, вы можете не просто останавливать зависшие программы, а тонко управлять распределением ресурсов сервера и диагностировать сложные проблемы.