Работа с фоновыми процессами — базовый, но часто неправильно используемый инструмент в Linux. Многие разработчики ограничиваются & или nohup, не до конца понимая, как именно устроены процессы, сигналы и управление сессиями.
В результате:
- процессы «внезапно» завершаются
- логирование теряется
- сервисы падают без восстановления
В этой статье разберём:
- как устроены процессы в Linux
- что происходит при закрытии терминала
- как работает
nohup - чем он отличается от
systemd - и какие инструменты подходят для разных задач
Как устроены процессы в Linux
Любая выполняемая программа в Linux — это процесс с собственным контекстом выполнения.
Основные атрибуты процесса
- PID (Process ID) — уникальный идентификатор
- PPID (Parent PID) — родительский процесс
- File descriptors (FD) — открытые файлы и сокеты
- STDIN / STDOUT / STDERR — стандартные потоки
- Сигналы — механизм взаимодействия с системой
Иерархия процессов
Процессы образуют дерево, где корневым процессом является systemd (PID 1):
systemd
└── sshd
└── bash
└── your_script
Такая иерархия важна, потому что поведение родителя влияет на дочерние процессы.
Foreground и background процессы
Процесс в переднем плане
sleep 60
- занимает терминал
- прерывается через
Ctrl + C
Процесс в фоне
sleep 60 &
- выполняется асинхронно
- освобождает терминал
Однако важно понимать:
& не защищает процесс от завершения при закрытии терминала.
Управление заданиями (job control)
jobs
Перевод процесса в фон
Ctrl + Z
bg
Возврат в foreground
fg %1
Сигналы и завершение процессов
Linux управляет процессами через сигналы.
Ключевые сигналы
| Сигнал | Назначение |
|---|---|
| SIGINT | прерывание (Ctrl+C) |
| SIGTERM | корректное завершение |
| SIGKILL | принудительное завершение |
| SIGHUP | закрытие терминала |
Что происходит при закрытии терминала
При завершении SSH-сессии или закрытии терминала:
- Уничтожается TTY
- Shell получает
SIGHUP - Shell пересылает сигнал дочерним процессам
В результате все связанные процессы завершаются, даже если были запущены через &.
nohup: защита от SIGHUP
Команда nohup позволяет игнорировать сигнал SIGHUP.
Пример использования
nohup python script.py &
Поведение nohup
- игнорирует
SIGHUP - перенаправляет вывод в
nohup.out - позволяет процессу продолжить выполнение после logout
Рекомендуемый вариант
nohup python script.py > app.log 2>&1 &
Это обеспечивает:
- корректное логирование
- отсутствие мусорных файлов
- удобство отладки
Работа с потоками вывода
> file.log # stdout
2>&1 # stderr в stdout
Корректное управление потоками критично для диагностики.
disown, сессии и управление терминалом
disown
Если процесс уже запущен:
python script.py &
disown %1
Он перестанет быть привязан к текущей сессии и не получит SIGHUP.
Контролирующий терминал
Каждый процесс связан с:
- сессией
- управляющим терминалом (TTY)
При его исчезновении система инициирует завершение процессов через SIGHUP.
Группы процессов
Linux оперирует не отдельными процессами, а группами:
- job = process group
- сигнал отправляется всей группе
Это объясняет, почему иногда завершается сразу несколько процессов.
Ограничения nohup
nohup решает только одну задачу — игнорирование SIGHUP.
Он не обеспечивает:
- автоперезапуск
- мониторинг
- централизованное логирование
- управление зависимостями
Поэтому его использование ограничено.
systemd: управление сервисами в Linux
systemd — стандартный менеджер сервисов в современных Linux-системах.
Основные возможности
- запуск сервисов при старте системы
- автоматический перезапуск
- централизованное логирование (
journalctl) - управление зависимостями
- ограничение ресурсов
Пример unit-файла
[Unit]
Description=My App
[Service]
ExecStart=/usr/bin/python /app/script.py
Restart=always
[Install]
WantedBy=multi-user.target
Сравнение nohup и systemd
| Возможность | nohup | systemd |
|---|---|---|
| Переживает logout | Да | Да |
| Автозапуск | Нет | Да |
| Перезапуск при падении | Нет | Да |
| Логирование | Ограничено | Полноценное |
| Контроль состояния | Нет | Да |
Альтернативы systemd
supervisord
- простой конфиг
- поддержка автоперезапуска
- подходит для приложений
tmux / screen
- сохраняют сессию
- позволяют reconnect
Подходят для интерактивной работы, но не для сервисов.
Docker
- изоляция процессов
- restart policies
- удобен в контейнерной инфраструктуре
Практические сценарии
Очередь Laravel
nohup php artisan queue:work > queue.log 2>&1 &
Python-скрипт
nohup python scraper.py > scraper.log 2>&1 &
Резервное копирование
nohup mysqldump -u root db > dump.sql 2>&1 &
Типичные ошибки
- использование
nohupв продакшене - отсутствие логирования
- непонимание сигналов
- путаница между job и PID
Вывод
Фоновые процессы в Linux — это не просто & и nohup, а целая система:
- сигналы
- сессии
- группы процессов
- менеджеры сервисов
Краткая рекомендация:
- для временных задач —
nohup - для интерактивной работы —
tmux - для production —
systemdили аналог
Понимание этих механизмов позволяет избежать типичных проблем и сделать поведение системы предсказуемым.