Что такое systemd?

Ответ

systemd — это современная система инициализации и менеджер служб для Linux, ставшая стандартом в большинстве дистрибутивов (RHEL/CentOS 7+, Ubuntu 16.04+, Debian 8+). Она заменяет старые системы SysVinit и Upstart.

Основные функции и компоненты в контексте DevOps:

  • Управление службами (демонами): Основная задача — запуск, остановка, перезагрузка и наблюдение за системными службами.
  • Параллельный запуск: Запускает службы параллельно, где это возможно, что значительно ускоряет загрузку системы.
  • Управление зависимостями: Службы объявляют свои зависимости (через Requires=, Wants=, After=), и systemd строит граф запуска.
  • Журналирование: Компонент journald собирает логи ядра, системных служб и приложений в централизованный структурированный журнал.
  • Управление точками монтирования, сокетами, таймерами: Позволяет активировать службы по событию (например, по подключению к сокету или по таймеру).

Основные команды для управления службами:

# Проверить статус службы (например, Nginx или Docker)
systemctl status nginx

# Запустить, остановить, перезапустить службу
systemctl start nginx
systemctl stop nginx
systemctl restart nginx

# Включить/отключить автозапуск службы при загрузке
systemctl enable nginx
systemctl disable nginx

# Просмотр логов службы в реальном времени (очень часто используется)
journalctl -u nginx -f

# Перезагрузить конфигурацию systemd после изменения файлов служб
systemctl daemon-reload

Пример файла службы для собственного приложения (/etc/systemd/system/myapp.service):

[Unit]
Description=My Python API Service
After=network.target
Requires=docker.service # Пример зависимости от Docker

[Service]
Type=simple
# В DevOps часто запускаем контейнеры
ExecStart=/usr/bin/docker run --name myapp-api my-registry.com/myapp:latest
ExecStop=/usr/bin/docker stop myapp-api
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

Ответ 18+ 🔞

А, systemd! Ну это, блядь, такая штука, которая в современных линуксах вместо старого доброго init'а сидит. Представь, что раньше система загружалась как черепаха, по одной службе, а теперь — ёпта, всё параллельно взлетает, как угорелое. Овердохуища скорости!

Основная её фишка — службами рулить. Допустим, тебе надо nginx поднять или docker. Раньше там скрипты в /etc/init.d/ писали, голову сломаешь. А теперь — чих-пых — пара команд.

Вот смотри, основные приколы, которые тебе как девопсу надо знать:

  1. Службы (демоны). Это её хлеб. Всё, что работает в фоне — её епархия.
  2. Зависимости. Это гениально. Служба может сказать: «Э, я без сети или без docker'а — нихуя не запущусь». И systemd умно дождётся, пока нужные штуки поднимутся. Никакого ручного таймаута в скриптах.
  3. Логи через journald. Раньше логи по всей системе были: тут /var/log/nginx/, там /var/log/syslog. А теперь всё в одну кучу, да ещё и с метаданными. Искать — одно удовольствие. Ну, почти.
  4. Активация по событиям. Это вообще магия. Можно службу настроить так, чтобы она стартанула не просто так, а когда к определённому сетевому порту кто-то подключится. Или когда таймер сработает. Удивление пиздец, честно.

Команды основные, их вызубрить надо:

# Глянуть, что творится со службой (жива ли, пашет ли)
systemctl status nginx

# Ну, тут всё ясно: завести, прибить, пнуть
systemctl start nginx
systemctl stop nginx
systemctl restart nginx

# Вот это важно! Чтобы служба после перезагрузки сама воскресла.
systemctl enable nginx   # Включить автозапуск
systemctl disable nginx  # Выключить автозапуск

# А это святое! Смотреть логи в реальном времени. Если что-то падает — первым делом сюда.
journalctl -u nginx -f

# А ЭТУ КОМАНДУ ЗАПОМНИ КАК «ОТЧЕ НАШ»! Если файл службы правил — ВСЕГДА делай reload, иначе systemd будет смотреть на тебя как на дурака и старую конфигурацию использовать.
systemctl daemon-reload

А вот пример, как свой сервис запилить. Допустим, у тебя питоновское API в докере. Создаёшь файл /etc/systemd/system/myapp.service и пишешь туда:

[Unit]
Description=My Python API Service
After=network.target          # Запускаться после сети
Requires=docker.service       # Жёсткая зависимость от докера. Нет докера — не будет и тебя.

[Service]
Type=simple
# Вот тут команда, которая всё запускает. В девопсе обычно докер.
ExecStart=/usr/bin/docker run --name myapp-api my-registry.com/myapp:latest
# Команда для аккуратной остановки
ExecStop=/usr/bin/docker stop myapp-api
# А это — магия живучести. Упал? Через 10 секунд systemd его снова поднимет. Красота!
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target    # В какой «целевой» юнит включаться при enable.

Короче, systemd — это мощный инструмент. Сначала кажется, что манда с ушами, но когда вникнешь — понимаешь, что жить без него уже не можешь. Главное — не забывай daemon-reload делать, а то доверия ебать ноль к такой работе.