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-сервер