Systemd управление службами Linux: руководство для начинающих

systemd для чайников: как не запутаться в службах Linux?

Привет, любители покопаться в дебрях Linux! 👋 Сегодня мы разберемся с тем, что многие считают «черной магией» — системой управления службами systemd.

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

Немного теории:

systemd работает с «единицами» (unit) — это абстрактные описания того, что нужно сделать (запустить программу, создать файл, запустить службу).

Самые важные из них — сервисы (service). Они описывают, как запустить и контролировать конкретную программу.

Как создать сервис?

  1. Создай файл с описанием сервиса в каталоге /lib/systemd/system/ (например, my-service.service).
  2. Перезагрузи systemd: sudo systemctl daemon-reload — это важно, чтобы systemd «увидел» твой новый сервис.

Долой rc.local!

Раньше для запуска программ при загрузке использовался файл /etc/rc.local. Но systemd предлагает более удобный способ: сервисы типа «oneshot».

Пример:

Создай файл /lib/systemd/system/simple-task.service с таким содержимым:

[Unit]
Description=Простая задача

[Service]
ExecStart=/bin/echo "Привет, мир!"

Type=oneshot

[Install]
WantedBy=multiuser.target 

Теперь ты можешь управлять этой задачей как любым другим сервисом:

  • sudo systemctl start simple-task.service — запустить
  • sudo systemctl enable simple-task.service — запустить при загрузке

Как сделать сервис из любой программы?

systemd позволяет превратить любую долгоживущую программу в сервис с помощью Type=idle. Он перехватывает стандартный ввод/вывод и следит за состоянием процесса.

Пример:

  1. Создай файл my-program.py с кодом:
import time

while True:
    print("Я работаю!")
    time.sleep(5)
  1. Создай файл /lib/systemd/system/my-program.service:
[Unit]
Description=Моя программа

[Service]
ExecStart=/usr/bin/python3 /path/to/my-program.py
Type=idle
KillMode=process
Restart=on-failure

Зависимости: кто от кого зависит? 🤝

systemd позволяет задать зависимости между службами, чтобы они запускались в нужном порядке.

Два типа зависимостей:

  • Мягкие (Wants): сервис запускается, даже если зависимый сервис не запустился.
  • Жесткие (Requires): сервис не запустится, пока не запустится зависимый сервис.

Пример:

В файле /lib/systemd/system/my-service.service:

[Unit]
Description=Мой сервис

After=network.target
Wants=ssh.service
Requires=database.service

Мой сервис запустится:

  • После запуска сети (network.target)
  • С учетом, что SSH-сервер (ssh.service) запущен, но не обязательно
  • Только после запуска базы данных (database.service)

Внедряемся в чужие зависимости 🕵️‍♀️

Хочешь, чтобы твой сервис запускался вместе с другим? Systemd позволяет это сделать!

Способы:

  1. Создай файл с настройками в /etc/systemd/system/${unit}.d/local.conf.
  2. Перезагрузи systemd: sudo systemctl daemon-reload

Пример:

Создай файл /etc/systemd/system/ssh.service.d/local.conf:

[Unit]
Requires=my-service.service

Теперь SSH-сервер будет запускаться *только* после запуска твоего сервиса!

Зависимости по умолчанию

Systemd добавляет зависимости к сервисам по умолчанию. Если ты хочешь, чтобы твой сервис запускался раньше, чем обычно, удали эти зависимости с помощью DefaultDependencies=no.

Пример:

[Unit]
Description=Ранний запуск

DefaultDependencies=no
After=systemd-remount-fs.service

Заключение

Systemd может показаться сложным, но не стоит бояться его! Прочитай документацию, поэкспериментируй с примерами и ты легко освоишь этот полезный инструмент.

Помни: система управления службами — это твой верный помощник в мире Linux!

Подпишись на Telegram!

Только важные новости и лучшие статьи
Подписаться

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Яндекс.Метрика
3wifi.ru © 2024