Рейтинг:2

Ошибка запуска systemd от имени пользователя. Не удалось подключиться к шине: $DBUS_SESSION_BUS_ADDRESS и $XDG_RUNTIME_DIR не определены

флаг sr

У меня есть сценарий, который работает от имени пользователя root, и я пытаюсь настроить его для пользовательской службы для запуска демона IPFS. Проблема в том, что мне нужно включить службу как пользователь, а не как root. Обычно это работает после перезагрузки, но я хотел бы избежать этого, если смогу.

Сценарий службы находится по адресу ~/.config/systemd/user/ipfs.service.

Это содержит:

[Ед. изм]
Описание=демон IPFS

[Оказание услуг]
# Environment="IPFS_PATH=/data/ipfs" # необязательный путь к каталогу инициализации ipfs, если он не указан по умолчанию (\$HOME/.ipfs)
ExecStart=/usr/local/bin/ipfs демон
Перезапуск = при сбое

[Установить]
WantedBy=default.target

(Я взял этот код отсюда: https://github.com/ipfs/go-ipfs/tree/master/misc )

Если я запускаю эту команду как пользователь, она работает правильно:

systemctl --user включить ipfs
systemctl --user запускает ipfs

Проблема в том, что мой скрипт работает от имени пользователя root, и я не могу понять, как заставить его работать от имени пользователя. Я пробовал это до сих пор:

    # Включить задержку, чтобы IPFS могла работать при загрузке
    loginctl включить-задерживать $USER_ACCOUNT

    # Разрешить запуск службы при загрузке
    sudo -u $USER_ACCOUNT systemctl --user включить ipfs

    # Запустить службу сейчас
    sudo -u $USER_ACCOUNT systemctl --пользователь запускает ipfs

К сожалению, при этом служба не запускается, и когда я получаю это сообщение об ошибке:

Не удалось подключиться к шине: $DBUS_SESSION_BUS_ADDRESS и $XDG_RUNTIME_DIR не определены (рассмотрите возможность использования [email protected] --user для подключения к шине другого пользователя)

После завершения сценария и перезагрузки служба запускается нормально, но я бы хотел, чтобы пользователю не приходилось перезагружаться, если это возможно. Любая помощь будет оценена по достоинству.

Nate T avatar
флаг it
Имеет ли значение, где работает скрипт? Если ответ отрицательный, попробуйте запустить с другого телетайпа. Иногда это сработает, когда кажется, что не должно. SystemD должен быть доступен из любого места. Это оболочка для входа в систему, поэтому файл env. требования будут другими. Честно говоря, я не знаю, будет ли это работать или нет, но мне любопытно.
флаг cn
В https://github.com/eriksjolund/user-systemd-service-actions-workflow/blob/main/.github/workflows/demo.yml#L18 мне пришлось добавить `sleep 1` и ``XDG_RUNTIME_DIR=/ запустить/пользователь/$UID`. Если вы работаете как root, вы также можете попробовать `systemd-run --quiet --machine= $USER_ACCOUNT@ --user --collect --pipe --wait systemctl --user enable ipfs`
Рейтинг:0
флаг us

Эти переменные зависят от пользователя. Они устанавливаются пользовательским экземпляром systemd, когда пользователь входит в систему. Если ваш скрипт работает как системная служба, то, конечно, он не имеет доступа к этой переменной для конкретного пользователя.

Если вы используете systemctl --user --global включить тогда услуга будет включена для всех пользователей.

Nate T avatar
флаг it
systemd — это не просто двоичный файл в каталоге bin. Это буквальная система. Нет конкретных пользовательских экземпляров.
флаг us
Есть два процесса systemd. Первый запускается как /sbin/init и запускает глобальные службы. Второй запускается, когда пользователь входит в систему и запускает пользовательские службы. Две рассматриваемые здесь переменные устанавливаются вторым процессом.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.