Найти в Дзене
I3WifiMan

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

Привет, любители покопаться в дебрях Linux! 👋 Сегодня мы разберемся с тем, что многие считают "черной магией" - системой управления службами systemd. Не пугайся, все не так страшно! systemd - это просто инструмент, который позволяет запускать программы в нужном порядке и следить за их состоянием. И да, он стал стандартом во всех современных дистрибутивах, так что знать его - просто необходимо. systemd работает с "единицами" (unit) - это абстрактные описания того, что нужно сделать (запустить программу, создать файл, запустить службу). Самые важные из них - сервисы (service). Они описывают, как запустить и контролировать конкретную программу. Раньше для запуска программ при загрузке использовался файл /etc/rc.local. Но systemd предлагает более удобный способ: сервисы типа "oneshot". Пример: Создай файл /lib/systemd/system/simple-task.service с таким содержимым: [Unit]
Description=Простая задача
[Service]
ExecStart=/bin/echo "Привет, мир!"
Type=oneshot
[Install]
WantedBy=multiuser.t
Оглавление

Привет, любители покопаться в дебрях 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!

Источник: https://3wifi.ru/operaczionnye-sistemy/linux/systemd-rukovodstvo-dlya-nachinayushhih/

ТГ: https://t.me/i3wifiman

ВК: https://vk.com/i3wifiman