Назад | Перейти на главную страницу

Невозможно использовать `systemctl --user` из-за« Не удалось получить соединение D-bus: в разрешении отказано »

Я пытаюсь настроить службы на уровне пользователя, используя этот ответ на аналогичный вопрос. Я создал необходимые файлы и перезагрузился.

Я добиваюсь прогресса, потому что теперь получаю «Не удалось установить соединение D-bus: разрешение отклонено», когда было «Не удалось установить соединение D-bus: соединение отклонено», но я в тупике, потому что не знаю, какой объект он пытается получить доступ (файл? сокет?) и поэтому не может даже проверить текущие разрешения. Любые идеи?

Пока я добавил:

loginctl enable-linger userservice

/usr/lib/systemd/user/dbus.service (-rw-r - r - корень корня)

[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 - корень корня)

[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

Никаких ссылок в другом месте не добавлено ...

Чтобы это не удалось:

systemctl --user status

Изменить 2018-10-25:

Добавлено export XDG_RUNTIME_DIR=/run/user/$(id -u) к .bashrc. Переменная установлена, и теперь я получаю: Failed to get D-us connection: no such file or directory. Как ни странно, ни man systemctl ни systemctl --help упомянуть --user вариант, в то время как оба упоминают --system и укажите, что это значение по умолчанию (каковы другие параметры).

Использование RHEL 7.4 (с systemd 219 как сообщает systemctl --version) с помощью SELinux.

Итак, существует давняя проблема, когда XDG_RUNTIME_DIR переменная окружения не устанавливается должным образом или вообще не устанавливается, когда пользователи входят в систему, и поэтому не может получить доступ к пользовательской D-Bus. Это происходит, когда пользователь входит в систему с помощью другого метода, кроме локальной графической консоли.

Вы можете обойти это, добавив к пользователю $HOME/.bashrc:

export XDG_RUNTIME_DIR=/run/user/$(id -u)

Затем выйдите и снова войдите.

Я заметил, что сервер tableau использует --user systemd services - у них даже есть примечание об этом в своих документах: https://help.tableau.com/current/server-linux/en-us/systemd_user_service_error.htm

Пользовательская служба systemd используется не так часто, как обычный менеджер процессов systemd. Red Hat отключила пользовательскую службу systemd в RHEL 7 (и, следовательно, во всех дистрибутивах RHEL, таких как CentOS, Oracle Linux 7, Amazon Linux 2). Однако RedHat заверил Tableau, что запуск пользовательской службы systemd поддерживается до тех пор, пока служба будет повторно включена.

Как они это делают (пример с идентификатором пользователя 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

После создания этого файла:

systemctl daemon-reload
systemctl enable user@29575.service
systemctl start user@29575.service

И вам нужно будет установить XDG_RUNTIME_DIR в env этого пользователя через bashrc или аналогичный:

[ -z "${XDG_RUNTIME_DIR}" ] && export XDG_RUNTIME_DIR=/run/user/$(id -ru)

Я тестировал последнюю версию RHEL 7.8, и она работает, как ожидалось, после этого я могу запустить "systemctl --user status" как мой пользователь.