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 disable
usł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_ADDRESS
co oznacza użycie systemctl --user
błę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.
źródło
sudo
dla 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 ...sudo
dokumentację - sudoers (5) ma wiele przykładów ograniczania argumentów polecenia.Odpowiedzi:
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>.service
dla ciebie jednostkę systemową, która uruchomi osobną instancję „--user” systemud. Nowy użytkownik systemowy odczyta pliki jednostek (zaczynając oddefault.target
) z~/.config/systemd/user/
,/etc/systemd/user/
i/usr/lib/systemd/user/
.źródło
DBUS_SESSION_BUS_ADDRESS
dla 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!