Я только что закончил процесс установки и настройки systemd в моей системе arch-linux (2012.09.07). Я удалил initscripts
(и удалил файлы конфигурации).
Я хочу создать службу, которая может запускаться и останавливаться пользователем без полномочий root. Служба запускает отдельный сеанс экрана с запущенным rtorrent. Однако я хочу, чтобы каждый пользователь в системе, который установил этот сервис для запуска (включения), имел конкретный экземпляр, запущенный для них специально. Как можно это сделать?
Я помню, как читал, что systemd поддерживает пользовательские экземпляры сервисов, однако мне не удалось найти какую-либо информацию о том, как это настроить, или имеет ли это отношение к тому, что я ищу.
Сервисный файл, который я использовал для системы:
[Unit]
Description=rTorrent
[Service]
Type=forking
ExecStart=/usr/bin/screen -d -m -S rtorrent /usr/bin/rtorrent
ExecStop=/usr/bin/killall -w -s 2 /usr/bin/rtorrent
ОБНОВЛЕНИЕ № 1 :
Прочитав страницы руководства здесь и здесь , я понимаю, как systemd работает немного лучше. В частности, использование параметров User=
и WorkingDirectory=
позволяет запускать службу в сеансе пользователя. Однако этот вопрос до сих пор остается то , что сами по себе пользователь не может start
, stop
, enable
или disable
услуги. Доступ запрещен ошибки определяется systemctl
.
ОБНОВЛЕНИЕ № 2 :
Во-первых, для упрощения и лучшего использования функции пользовательского сеанса systemd (все еще несколько незавершенной), я использовал пользовательские сеансовые модули sofar и следовал его советам по настройке.
Похоже, в текущей версии DBus (1.6.4-1) есть ошибка, из-за которой она не устанавливает DBUS_SESSION_BUS_ADDRESS
значение переменной окружения, используя systemctl --user
команду error с:
Failed to get D-Bus connection: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
Переменная должна выглядеть так:
DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/USERUID/dbus/user_bus_socket"
где USERUID должен быть UID данного пользователя.
sudo
пользователей и заставить их, как уже упоминалось в моем комментарии выше, управлять своим собственным файлом сервиса. Однако это решение позволит пользователю контролировать большинство других служб ...sudo
документацию, этого не произошло бы - у sudoers (5) есть много примеров ограничения аргументов команды.Ответы:
Обычно systemd не позволяет обычным пользователям запускать системные службы. Хотя он поддерживает предоставление доступа через polkit, этой части все еще не хватает, и вы пока не можете разрешить только один конкретный сервис.
Поскольку rtorrent на самом деле не является системной службой, и вы хотите, чтобы у каждого пользователя был свой экземпляр rtorrent, поэкспериментируйте с режимом systemd «пользователь».
Когда вы войдете в систему, система запустит
user@<uid>.service
для вас системный блок, который запустит отдельный экземпляр «--user» systemd. Новый user-systemd будет читать файлы модулей (начиная сdefault.target
) из~/.config/systemd/user/
,/etc/systemd/user/
и/usr/lib/systemd/user/
.источник
DBUS_SESSION_BUS_ADDRESS
для данного пользователя, поэтому systemctl не может получить доступ к пользовательскому сеансу, он ошибается. Как только я понял эту маленькую проблему, все остальное работает прекрасно!