Як налаштувати системну службу, яку повинен запустити користувач, що не користується коренем, як демон користувача?


20

Я щойно закінчив процес встановлення та налаштування systemd в моїй системі arch-linux (2012.09.07). Я видалив initscripts(і видалив файли конфігурації).

Що я хочу зробити - це створити службу, яку може запускати та зупиняти користувач, що не має права доступу. Послуга полягає у запуску окремого сеансу на екрані під керуванням 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помилки команди з:

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) має багато прикладів обмеження аргументів команди.
grawity

Відповіді:


19

systemd зазвичай не дозволяє звичайним користувачам запускати системні послуги. Хоча він підтримує надання доступу через polkit, цієї частини все ще дещо бракує, і ви поки не можете дозволити лише одну конкретну послугу.

Оскільки rtorrent насправді не є системною службою, і тому, що ви хочете, щоб кожен користувач мав свій власний екземпляр rtorrent, експериментуйте з режимом "user" користувача systemd.

Коли ви ввійдете в систему, система запустить user@<uid>.serviceдля вас системний блок, який запустить окремий екземпляр "--user" системи. Останній зареєстрований учасник-Systemd читатиме файли секцій (починаючи з default.target) від ~/.config/systemd/user/, /etc/systemd/user/і /usr/lib/systemd/user/.


1
Дякую шанобливості, це було в основному те, що мені не вистачало. Однак, виявляється, це була і проблема DBus: здається, в dbuse є помилка, яка не встановлює правильну глобальну змінну DBUS_SESSION_BUS_ADDRESSдля даного користувача, тому systemctl не може отримати доступ до сеансу користувача, він помиляє нашу. Як тільки я зрозумів цю маленьку проблему, все інше прекрасно працює!
Ганс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.