Nie można użyć argumentu „systemctl --user” z powodu „Nie udało się uzyskać połączenia D-bus: odmowa uprawnień”


Próbuję skonfigurować usługi na poziomie użytkownika za pomocą

ta odpowiedź
https://serverfault.com/a/906224
na podobne pytanie. Utworzyłem wymagane pliki i zrestartowałem.
Robię postępy, ponieważ teraz otrzymuję komunikat „Nie udało się nawiązać połączenia D-bus: odmowa pozwolenia”, gdy było „Nieudane ustanowienie połączenia D-bus: połączenie odrzucone”, ale jestem zaskoczony, ponieważ nie wiem, który to jest obiekt próbuje uzyskać dostęp (plik? gniazdo?) i dlatego nie może nawet sprawdzić bieżących uprawnień. Jakieś pomysły?
Do tej pory dodałem:
loginctl enable-linger userservice


/usr/lib/systemd/user/dbus.service (-rw-r - r to root root)
>
[Unit]
Description=D-Bus User Message Bus
Requires=dbus.socket[Service]
ExecStart=/usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation
ExecReload=/usr/bin/dbus-send --print-reply --session --type=method_call --dest=org.freedesktop.DBus/org.freedesktop.DBus.ReloadConfig[Install]
Also=dbus.socket


/usr/lib/systemd/user/dbus.socket (-rw-r - r - root root)
>
[Unit]
Description=D-Bus User Message Bus Socket[Socket]
ListenStream=%t/bus
ExecStartPost=-/bin/systemctl --user set-environment DBUS_SESSION_BUS_ADDRESS=unix:path=%t/bus[Install]
WantedBy=sockets.target
Also=dbus.service


/home/uservice/.config/systemd/user/uservice.service
>
[Unit]
Description=Test user-level service[Service]
Type=dbus
BusName=com.wtf.service
ExecStart=/home/userservice/userservice.py
Restart=on-failure[Install]
WantedBy=default.target

Żadne linki nie zostały dodane gdzie indziej ...
Aby temu zapobiec:
systemctl --user status

Edycja 2018-10-25:
Dodany
       export XDG_RUNTIME_DIR=/run/user/$(id -u)
do
       .bashrc
... Zmienna jest ustawiona i teraz otrzymuję:
       Failed to get D-us connection: no such file or directory
... Co dziwne, nie
       man systemctl
ani
       systemctl --help
wzmianka
       --user
opcja, podczas gdy obie wspominają
       --system
i określ, że jest to ustawienie domyślne (jakie są inne opcje).
Korzystanie z RHEL 7.4 (z
       systemd 219
jak donosi
       systemctl --version
) za pomocą SELinux.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Więc istnieje długotrwały problem, kiedy
         XDG_RUNTIME_DIR
zmienna środowiskowa nie jest ustawiona prawidłowo lub w ogóle nie jest ustawiona, gdy użytkownicy logują się i dlatego nie mogą uzyskać dostępu do niestandardowej magistrali D-Bus. Dzieje się tak, gdy użytkownik loguje się przy użyciu metody innej niż lokalna konsola graficzna.
Możesz obejść ten problem, dodając do użytkownika
         $HOME/.bashrc
:
export XDG_RUNTIME_DIR=/run/user/$(id -u)

Następnie wyloguj się i zaloguj ponownie.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Zauważyłem, że serwer tableau używa usług --user systemd - mają nawet notatkę na ten temat w swoich dokumentach:

https://help.tableau.com/curre ... r.htm
https://help.tableau.com/curre ... htmUsługa użytkownika systemd nie jest używana tak często, jak zwykły menedżer procesów systemd. Red Hat wyłączył niestandardową usługę systemd w RHEL 7 (a zatem we wszystkich dystrybucjach RHEL, takich jak CentOS, Oracle Linux 7, Amazon Linux 2). Jednak RedHat zapewnił Tableau, że uruchamianie niestandardowej usługi systemd jest obsługiwane, o ile usługa jest ponownie włączona.

Jak to robią (przykład z identyfikatorem użytkownika 29575)
# cat/etc/systemd/system/user@29575.service
[Unit]
Description=User Manager for UID %i
After=systemd-user-sessions.service
# These are present in the RHEL8 version of this file except that the unit is Requires, not Wants.
# It's listed as Wants here so that if this file is used in a RHEL7 settings, it will not fail.
# If a user upgrades from RHEL7 to RHEL8, this unit file will continue to work until it's
# deleted the next time they upgrade Tableau Server itself.
After=user-runtime-dir@%i.service
Wants=user-runtime-dir@%i.service[Service]
LimitNOFILE=infinity
LimitNPROC=infinity
User=%i
PAMName=systemd-user
Type=notify
# PermissionsStartOnly is deprecated and will be removed in future versions of systemd
# This is required for all systemd versions prior to version 231
PermissionsStartOnly=true
ExecStartPre=/bin/loginctl enable-linger %i
ExecStart=-/lib/systemd/systemd --user
Slice=user-%i.slice
KillMode=mixed
Delegate=yes
TasksMax=infinity
Restart=always
RestartSec=15[Install]
WantedBy=default.target

Po utworzeniu tego pliku:
systemctl daemon-reload
systemctl enable user@29575.service
systemctl start user@29575.service

Będziesz musiał ustawić XDG_RUNTIME_DIR w środowisku tego użytkownika za pomocą bashrc lub podobnego:
[ -z "${XDG_RUNTIME_DIR}" ] && export XDG_RUNTIME_DIR=/run/user/$(id -ru)

Przetestowałem najnowszy RHEL 7.8 i działa zgodnie z oczekiwaniami, po czym mogę uruchomić "systemctl - status użytkownika" jako mój użytkownik.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się