systemctl — основная утилита командной строки для управления systemd: запуск, остановка, перезапуск сервисов; включение/отключение автозапуска; просмотр статуса и журналов. systemd — система инициализации Linux, заменившая SysVinit и Upstart. systemctl — интерфейс для всего, что делает systemd.
Основные команды
# Управление сервисом
systemctl start nginx # запустить
systemctl stop nginx # остановить
systemctl restart nginx # перезапустить (с остановкой)
systemctl reload nginx # перечитать конфиг без перезапуска
systemctl status nginx # статус + последние строки журнала
# Автозапуск
systemctl enable nginx # включить автозапуск
systemctl disable nginx # отключить автозапуск
systemctl enable --now nginx # включить + запустить сейчас
# Система
systemctl list-units --type=service # список всех сервисов
systemctl list-unit-files # список unit-файлов
systemctl daemon-reload # перечитать unit-файлы после изменений
systemctl reboot # перезагрузка
systemctl poweroff # выключение
Структура unit-файла
[Unit]
Description=My Web Application
After=network.target mysql.service
[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/myapp
ExecStart=/usr/bin/node /var/www/myapp/server.js
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Unit-файлы хранятся в /lib/systemd/system/ (системные) и /etc/systemd/system/ (пользовательские, имеют приоритет). После изменения unit-файла: systemctl daemon-reload.
История
systemd разработан Леннартом Пёттерингом (Lennart Poettering) и Кей Сиверсом (Kay Sievers) в Red Hat, впервые включён в Fedora 15 (2011). Ubuntu перешёл на systemd с Ubuntu 15.04 (2015). Debian — с Debian 8 Jessie (2015). RHEL 7/CentOS 7 (2014) — первые корпоративные дистрибутивы с systemd. До systemd использовались SysVinit (init-скрипты в /etc/init.d/) и Upstart (Ubuntu 6.10–14.10).
На что обращать внимание
На VPS systemctl — главный инструмент: systemctl status nginx покажет, запущен ли сервис и последние строки журнала. Если сервис падает в loop — смотри journalctl -u nginx -n 50 для последних 50 строк лога. Для сервисов с пользовательскими данными (Node.js, Python) убедись, что указан WorkingDirectory и правильный User. Опция Restart=on-failure + RestartSec=5 — обязательна для продакшн-сервисов: systemd автоматически перезапустит при краше.
История systemd и systemctl
systemd разработан Леннартом Поттерингом (Lennart Poettering) и Кэем Сиверсом (Kay Sievers) в Red Hat в 2010 году. Версия 1.0 включена в Fedora 15 (2011). Принятие systemd шло постепенно и с полемикой: Ubuntu 15.04 (2015), Debian 8 «Jessie» (2015), RHEL 7 (2014) перешли на systemd. SysVinit и Upstart полностью вытеснены к 2015–2016 году. systemd 253 (2023) — текущая версия с поддержкой Unified Kernel Image (UKI) и TPM2.
Написание systemd-юнита
[Unit]
Description=My Python App
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/venv/bin/gunicorn app:application
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Файл сохраняется в /etc/systemd/system/myapp.service. После создания: systemctl daemon-reload + systemctl enable --now myapp. Журнал службы: journalctl -u myapp -f — live-поток.
На что обращать внимание
После изменения юнит-файла всегда выполняй systemctl daemon-reload — иначе systemd читает старую версию из кэша. systemctl status показывает последние 5–10 строк лога — для полного лога используй journalctl. Опции Restart=on-failure и RestartSec=5 обязательны для production-сервисов. Для указания зависимостей между сервисами используй Requires= (обязательная) и Wants= (опциональная). Type=notify используется для сервисов, которые сигнализируют systemd о готовности через sd_notify().