Linux & Administration

systemd / демоны

Демон — фоновый процесс без интерфейса, а systemd — система инициализации Linux, которая этими процессами управляет.

Что такое демон

Демон (daemon) — программа, работающая в фоне без привязки к терминалу и пользователю: она стартует при загрузке системы, молча делает свою работу и пишет в лог, а не на экран. Веб-сервер, СУБД, планировщик, SSH-сервер — всё это демоны.

Отсюда традиция называть их с буквой d на конце: sshd, httpd, crond, dockerd, systemd. Название пришло из проекта MIT и отсылает к демону Максвелла — незаметному существу, которое делает полезную работу за кулисами; к нечистой силе отношения не имеет.

В Windows тот же концепт называется службой (service).

Что такое systemd

systemd — система инициализации современного Linux. Это самый первый процесс, который запускает ядро (PID 1), и родитель всех остальных. Он поднимает демоны при загрузке, следит за ними, перезапускает упавшие, собирает их логи и выключает в правильном порядке.

systemd вытеснил старый SysV init по одной практической причине: раньше служба описывалась shell-скриптом на сотню строк, где вручную писались запуск, PID-файл и остановка. В systemd то же самое — десять строк декларативного конфига, а перезапуск, ограничения по памяти и зависимости идут из коробки. Сегодня systemd используют Debian, Ubuntu, RHEL, Fedora и почти все остальные крупные дистрибутивы.

Что такое systemctl

systemctl — команда для управления systemd. Именно её вы набираете каждый день:

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    # не запускать при загрузке

Главная ловушка новичка: start и enable — разные вещи. start запускает службу сейчас, enable включает автозапуск при перезагрузке. Сервис, поднятый только через start, не переживёт ребут. Обе операции разом — systemctl enable --now nginx.

Юнит-файл: свой сервис за десять строк

Юнит (unit) — описание того, чем systemd управляет. Свои сервисы кладут в /etc/systemd/system/:

[Unit]
Description=My FastAPI application
After=network.target postgresql.service

[Service]
Type=simple
User=appuser
WorkingDirectory=/srv/myapp
ExecStart=/srv/myapp/venv/bin/gunicorn -w 4 -b 127.0.0.1:8000 app:application
Restart=always
RestartSec=5
MemoryMax=2G

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload      # перечитать юниты после правки файла
sudo systemctl enable --now myapp

Restart=always поднимет процесс, если он упал или его прибил OOM killer. MemoryMax ограничит аппетит через cgroups — тот же механизм, на котором работают контейнеры. After= задаёт порядок запуска: приложение не стартует раньше сети и базы.

Логи: journalctl

systemd забирает stdout и stderr демонов в общий журнал, поэтому приложению достаточно печатать в консоль — файл лога и ротацию писать не надо.

journalctl -u myapp -f                 # хвост лога в реальном времени
journalctl -u myapp --since "1 hour ago"
journalctl -u myapp -p err             # только ошибки
journalctl -u myapp -b                 # с последней загрузки

Таймеры вместо cron

systemd умеет и запуск по расписанию — юнит .timer вместо строки в crontab. Плюсы: расписание видно в systemctl list-timers, вывод падает в общий журнал, есть Persistent=true для пропущенных из-за выключения запусков. Минус — многословнее одной строки cron. Для простой еженощной задачи cron всё ещё удобнее.

Связанные термины

  • Linux — система, где systemd работает под PID 1
  • Nginx — типичный демон под управлением systemd
  • Gunicorn / WSGI — приложение, которое обычно оформляют юнитом
  • OOM killer — от кого спасает Restart=always
  • контейнер — альтернативный способ изолировать и перезапускать сервисы
  • CLI — среда, где живут systemctl и journalctl

Готовы запустить GPU-задачу?

Запустить GPU-сервер