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