Jak skonfigurować usługę systemową, która ma być uruchamiana przez użytkownika innego niż root jako demon użytkownika?

20

Właśnie skończyłem proces instalacji i konfiguracji systemd na moim systemie arch-linux (2012.09.07). Odinstalowałem initscripts(i usunąłem pliki konfiguracyjne).

Chcę utworzyć usługę, która może być uruchamiana i zatrzymywana przez użytkownika innego niż root. Usługa polega na uruchomieniu odłączonej sesji ekranowej z uruchomionym programem rtorrent. Chcę jednak, aby każdy użytkownik w systemie, który skonfigurował tę usługę do uruchomienia (włączony), miał konkretną instancję uruchomioną specjalnie dla nich. Jak można to zrobić?

Pamiętam, że przeczytałem, że systemd obsługuje instancje usług użytkowników, jednak nie byłem w stanie znaleźć żadnych informacji o tym, jak to skonfigurować, ani czy dotyczy to tego, czego szukam.

Plik usługi, którego użyłem dla systemu:

[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

AKTUALIZACJA # 1 :

Po przeczytaniu stron podręcznika tu i tutaj rozumiem, jak systemd działa nieco lepiej. W szczególności korzystanie z opcji User=i WorkingDirectory=pozwala na uruchomienie usługi w sesji użytkownika. Jednak problem nadal pozostaje, że użytkownik nie może sami start, stop, enable, lub disableusługa. Odmowa dostępu Błąd jest przez systemctl.

AKTUALIZACJA # 2 :

Po pierwsze, dla uproszczenia i lepszego wykorzystania sesji użytkownika systemd (wciąż nieco niekompletnej) użyłem jednostek sesji użytkownika sofara i postępowałem zgodnie z jego radą konfiguracji.

Wygląda na to, że w obecnej wersji DBus (1.6.4-1) występuje błąd, w którym nie ustawia zmiennej środowiskowej, DBUS_SESSION_BUS_ADDRESSco oznacza użycie systemctl --userbłędów poleceń za pomocą:

Failed to get D-Bus connection: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11

Zmienna powinna wyglądać następująco:

DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/USERUID/dbus/user_bus_socket"

gdzie USERUID musi być UID danego użytkownika.

Hans
źródło
Zdaję sobie sprawę, że można utworzyć osobny plik usługi dla użytkownika i po prostu go włączyć. Chciałbym jednak wiedzieć, czy byłoby to możliwe w sposób opisany powyżej.
Hans
Szczerze mówiąc, mogłem prostą konfigurację sudodla użytkowników i umożliwić im, jak wspomniano w moim komentarzu powyżej, kontrolowanie własnego pliku usługi. Jednak to rozwiązanie pozwoliłoby użytkownikowi kontrolować również większość innych usług ...
Hans
Nie byłoby, gdybyś przeczytał sudodokumentację - sudoers (5) ma wiele przykładów ograniczania argumentów polecenia.
grawitacja

Odpowiedzi:

19

Systemd zwykle nie pozwala zwykłym użytkownikom na uruchamianie usług systemowych. Chociaż obsługuje udostępnianie za pośrednictwem pakietu polkit, tej części wciąż brakuje, a nie można jeszcze zezwolić tylko na jedną konkretną usługę.

Ponieważ rtorrent nie jest w rzeczywistości usługą systemową, a ponieważ chcesz, aby każdy użytkownik miał własną instancję rtorrent, eksperymentuj z trybem „użytkownika” systemda.

Po zalogowaniu system uruchomi user@<uid>.servicedla ciebie jednostkę systemową, która uruchomi osobną instancję „--user” systemud. Nowy użytkownik systemowy odczyta pliki jednostek (zaczynając od default.target) z ~/.config/systemd/user/, /etc/systemd/user/i /usr/lib/systemd/user/.

grawitacja
źródło
1
Dzięki grawitacji właśnie tego mi brakowało. Jednak okazuje się, że był to również problem z DBus: wydaje się, że w dbuse występuje błąd, który nie ustawia poprawnej zmiennej globalnej DBUS_SESSION_BUS_ADDRESSdla danego użytkownika, więc systemctl nie może uzyskać dostępu do sesji użytkownika, to my błąd. Kiedy odkryłem ten mały problem, wszystko inne działa pięknie!
Hans