切换至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用户再操作,可以试试不用-参数切换(-会清空所有环境变量):
- 切换用户:
sudo su media
- 手动启动用户级的DBus服务:
systemctl --user start dbus.socket
- 手动设置环境变量(要是想一劳永逸,把这两行加到
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
相关产品推荐
相关产品推荐

