configurations/linux/src/systemd.md

5.7 KiB
Raw Blame History

systemd

Пользовательский сервис с доступом к X11

Для запуска пользовательских сервисов необходимо импортировать данные в переменную XDG_RUNTIME_DIR. Это можно сделать путём определения переменной в файле, который передаётся на запуск startx или xinit (например файл ~/.xinitrc)::

export XDG_RUNTIME_DIR=/run/user/$(id -u)

Пример пользовательского сервиса

Структура сервиса в качестве примера:

.
├── bin
│   └── myprogram
└── etc
    └── systemd
        └── user
            └── myprogram.service

где bin/myprogram - исполняемый файл самой программы, которую необходимо запускать в качестве пользовательского сервиса systemd. Файл /etc/systemd/user/myprogram.service:

[Unit]
Description=myprogram
PartOf=graphical-session.target

[Service]
ExecStart=/bin/myprogram

[Install]
WantedBy=default.target

Для автозагрузки сервиса необходимо создать ссылку на сам сервис в домашней директории ~/.config/systemd/user/graphical-session.target.wants/myprogram.service:

.config
└── systemd
    └── user
        └── graphical-session.target.wants
            └── myprogram.service -> /etc/systemd/user/myprogram.service

Делается это командой:

systemctl --user enable myprogram.service

Так как сервис запускается после входа пользователя в систему, то необходимо в файл, который передаётся на запуск startx или xinit добавить строку запсука myprogram.service (например, в файл ~/.xinitrc):

systemctl --user start myprogram.service

После чего сервис myprogram.service будет автоматически запускаться после входа пользователя в систему.

Пример пользовательского сервиса с использованием "якоря" xsession.target

Структура сервиса в качестве примера:

.
├── bin
│   └── myprogram
└── etc
    └── systemd
        └── user
            ├── myprogram.service
            └── xsession.target

где bin/myprogram - исполняемый файл самой программы, которую необходимо запускать в качестве пользовательского сервиса systemd. Файл /etc/systemd/user/myprogram.service:

[Unit]
Description=myprogram
PartOf=graphical-session.target

[Service]
ExecStart=/bin/myprogram

[Install]
WantedBy=xsession.target

Файл /etc/systemd/user/xsession.target используемый в качестве "якоря", на который будут цепляться остальные сервисы:

[Unit]
Description=X session managed by systemd
BindsTo=graphical-session.target

Для автозагрузки сервиса необходимо создать ссылку на сам сервис в домашней директории ~/.config/systemd/user/graphical-session.target.wants/myprogram.service:

.config
└── systemd
    └── user
        └── graphical-session.target.wants
            └── myprogram.service -> /etc/systemd/user/myprogram.service

Делается это командой:

systemctl --user enable myprogram.service

Так как сервис запускается после входа пользователя в систему, то необходимо в файл, который передаётся на запуск startx или xinit добавить строку запсука "якоря" xsession.target (например, в файл ~/.xinitrc):

systemctl --no-block --user start xsession.target

После чего сервис myprogram.service будет автоматически запускаться после входа пользователя в систему.

Просмотр журнала

journalctl -b -u docker

где

  • -b - показать сообщения с момента последней (текущей) загрузки системы
  • -u - показать журнал с указанного сервиса (docker)

Анализ производительности загрузки системы

Вывести SVG-графику с подробным описанием того, какие системные службы были запущены в какое время, выделяя время, затраченное ими на инициализацию:

systemd-analyze plot > boot.svg

Параметры сервиса

Чтобы перед запуском службы выполнить какой либо процесс, необходимо указать ExecStartPre. Например, чтобы обеспечить задержку перед запуском службы необходимо добавить:

[Service]
ExecStartPre=/bin/sleep 30