Загрузка...

Фоновые процессы в Linux: nohup, SIGHUP, systemd

Работа с фоновыми процессами — базовый, но часто неправильно используемый инструмент в 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-сессии или закрытии терминала:

  1. Уничтожается TTY
  2. Shell получает SIGHUP
  3. 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 или аналог

Понимание этих механизмов позволяет избежать типичных проблем и сделать поведение системы предсказуемым.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *