You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

切换至media用户后无法使用systemctl --user管理用户服务的问题求助

切换至media用户后无法使用systemctl --user管理用户服务的问题求助

问题描述

我尝试以media用户身份创建一个服务,但操作过程中遇到了报错,具体步骤和输出如下:

admin $ sudo su - media

$ systemctl --user edit fmgr-copro.service --full --force
Failed to connect to bus: $DBUS_SESSION_BUS_ADDRESS and $XDG_RUNTIME_DIR not defined (consider using --machine=<user>@.host --user to connect to bus of other user)

$ exit

admin $ systemctl status dbus -n 2
● dbus.service - D-Bus System Message Bus
Loaded: loaded (/lib/systemd/system/dbus.service; static)
Active: active (running) since Wed 2023-03-22 15:07:24 CET; 1 week 0 days ago
TriggeredBy: ● dbus.socket
Docs: man:dbus-daemon(1)
Main PID: 869 (dbus-daemon)
Tasks: 1 (limit: 38289)
Memory: 1.7M
CPU: 4.125s
CGroup: /system.slice/dbus.service
└─869 @dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only

Mar 28 10:09:57 myServer dbus-daemon[869]: [system] Activating via systemd: service name='org.freedesktop.hostname1' unit='dbus-org.freedesktop.hostname1.service' r>
Mar 28 10:09:57 myServer dbus-daemon[869]: [system] Successfully activated service 'org.freedesktop.hostname1'

admin $ sudo su - media

$ echo $XDG_RUNTIME_DIR

$ echo $DBUS_SESSION_BUS_ADDRESS

$

补充说明:切换到media用户后,DBUS_SESSION_BUS_ADDRESS和XDG_RUNTIME_DIR这两个环境变量被清空了,应该是导致问题的核心原因,请问该怎么解决?


解决方案

这个问题我碰到过好多次啦,本质原因是用sudo su - media切换用户时,会完全重置成一个全新的登录会话,但这个会话并没有启动用户专属的systemd实例和对应的DBus会话,所以才会缺失那两个关键环境变量。给你几个实用的解决办法:

方法一:直接跨用户操作(最推荐)

不用切换到media用户,直接从admin用户用machinectl命令操作media的用户服务,它会自动帮你处理好环境变量的问题:

sudo machinectl shell media@.host systemctl --user edit fmgr-copro.service --full --force

这个命令相当于直接“钻进”media用户的systemd会话里操作,一步到位,省心又不容易出错。

方法二:切换用户时保留部分环境,手动补全变量

如果你习惯先切换到media用户再操作,可以试试不用-参数切换(-会清空所有环境变量):

  1. 切换用户:
sudo su media
  1. 手动启动用户级的DBus服务:
systemctl --user start dbus.socket
  1. 手动设置环境变量(要是想一劳永逸,把这两行加到media用户的~/.bashrc里,下次登录就自动生效了):
export XDG_RUNTIME_DIR="/run/user/$(id -u media)"
export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"

做完这些再执行systemctl --user的命令就正常了。

方法三:开启linger功能,让用户服务常驻

如果media用户需要长期运行自己的服务,哪怕没人登录也能保持运行,可以开启linger功能:

sudo loginctl enable-linger media

开启后,media用户的systemd实例会一直后台运行,不管你什么时候切换过去,环境变量都是正常的,非常适合需要持续运行用户服务的场景。


备注:内容来源于stack exchange,提问作者SebMa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 11:14:07