Знание должно быть доступно!

Путь /ОС/Linux

Как стартует system'a с systemd на борту: image.png

1. Что за зверь systemd?

systemd - вождь всех демонов в GNU/Linux. Он:

  • поднимает юниты (службы, таймеры, сокеты);
  • решает зависимости;
  • даёт лог через journalctl;
  • заменяет init, cron, inetd.

Орки любят systemd, потому что он как боевой шаман: один командует всем племенем процессов.

2. Что такое юнит?

Юнит = текстовый файл .service / .timer / .socket / .target.
Лежат в /usr/lib/systemd/system/ или ~/.config/systemd/user/.

Пример - сервис:

[Unit]  
Description=Боевой демон  
  
[Service]  
ExecStart=/usr/bin/orc-daemon  
Restart=always  
  
[Install]  
WantedBy=default.target

3. Основные секции

  • [Unit] - описание и зависимости.
  • [Service] - что и как запускать.
  • [Install] - к чему прицепить при enable.
  • Дополнительно: [Timer], [Socket], [Path], [Target].

4. Директивы, что каждый орк обязан знать

[Unit]  
Description=        # коммент  
After=foo.service   # после  
Wants=bar.target    # мягкая связь  
  
[Service]  
ExecStart=/cmd args # что запускать  
ExecStartPre=/bin/sleep 5 # задержка  
Restart=on-failure  # рестарт при падении  
Environment=VAR=orc  
Type=simple         # тип демона  
  
[Install]  
WantedBy=default.target

5. Targets - тотемы

default.target → твой юзерский дефолт.
graphical.target → когда графика поднята.
multi-user.target → консольный уровень.
graphical-session.target → у DE (GNOME/KDE).
Можно делать свои (xsession.target для i3).


6. systemctl - боевой топор

systemctl status foo.service      # статус  
systemctl start foo.service       # запустить  
systemctl stop foo.service        # остановить  
systemctl restart foo.service     # рестарт  
systemctl enable foo.service      # автозапуск  
systemctl disable foo.service     # убрать  
systemctl -user …                # юзерский режим
  1. journalctl - шаманский барабан
journalctl -u foo.service         # логи юнита  
journalctl -xe                    # последние ошибки  
journalctl -user -u foo.service  # юзер-юнит

8. Таймеры вместо cron

foo.timer + foo.service.

[Unit]  
Description=Будильник  
  
[Timer]  
OnBootSec=10min  
OnUnitActiveSec=1h  
  
[Install]  
WantedBy=timers.target

Проверка:

systemctl list-timers 

пример

❯ cat .config/systemd/user/remind_popup.timer

[Unit]
Description=Every 60 minutes nagbar popup

[Timer]
OnCalendar=Mon..Fri 08..17:00
Persistent=true

[Install]
WantedBy=timers.target
день недели: Mon Tue Wed Thu Fri Sat Sun  
диапазон: Mon..Fri  
список: Mon,Wed,Fri  
  
год: 2026 или *  
месяц: 03 или Mar или *  
день месяца: 01, 15, 31 или *  
  
время: 12:30  
12:30:00  
диапазон часов: 08..17:00  
шаги: *:0/15

Больше по диапазонам тут: https://www.freedesktop.org/software/systemd/man/latest/systemd.time.html

проверка диапазона:

systemd-analyze calendar "Mon..Fri 08..17:00"
systemd-analyze calendar "Mon..Fri 08..17:00"
sudo systemctl daemon-reload
sudo systemctl enable --now backup-arbitr.timer
//Посмотреть все таймры
systemctl list-timers --all
systemctl status backup-arbitr.timer
systemctl start backup-arbitr.service
journalctl -u backup-arbitr.service -n 200 --no-pager
systemctl is-enabled backup-arbitr.timer  
systemctl is-active backup-arbitr.timer  
systemctl status backup-arbitr.timer  
systemctl list-timers | grep backup-arbitr 

is-enabled покажет автозапуск, is-active - запущен ли таймер сейчас.

При изменении:

sudo systemctl daemon-reload  
sudo systemctl restart backup-arbitr.timer

9. Сокеты и ленивый старт

Можно сделать .socket, который слушает порт, и .service, который оживает при коннекте. Экономия ресурсов, как орк спящий до боя.

10. Советы юного орка

  • Не бойся systemctl edit --user foo.service - override хранится в ~/.config/systemd/user.
  • Юнит = просто текстовый файл, редактируй как .ini
  • Для отладки: systemd-analyze verify foo.service.
  • Не делай костылей со sleep, если можно подвязать через After=/Wants=.

⚡ Итог: systemd = тотемный шаман Linux. Изучи его магию - и ты сможешь приручить любой демон.