Привет, любители покопаться в дебрях Linux! 👋 Сегодня мы разберемся с тем, что многие считают «черной магией» — системой управления службами systemd.
Не пугайся, все не так страшно! systemd — это просто инструмент, который позволяет запускать программы в нужном порядке и следить за их состоянием. И да, он стал стандартом во всех современных дистрибутивах, так что знать его — просто необходимо.
Оглавление
Немного теории:
systemd работает с «единицами» (unit) — это абстрактные описания того, что нужно сделать (запустить программу, создать файл, запустить службу).
Самые важные из них — сервисы (service). Они описывают, как запустить и контролировать конкретную программу.
Как создать сервис?
- Создай файл с описанием сервиса в каталоге
/lib/systemd/system/
(например,my-service.service
). - Перезагрузи 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
. Он перехватывает стандартный ввод/вывод и следит за состоянием процесса.
Пример:
- Создай файл
my-program.py
с кодом:
import time
while True:
print("Я работаю!")
time.sleep(5)
- Создай файл
/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 позволяет это сделать!
Способы:
- Создай файл с настройками в
/etc/systemd/system/${unit}.d/local.conf
. - Перезагрузи 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!
Только важные новости и лучшие статьи
Подписаться