当我尝试runuser -l mruser -c "systemctl --user status myservice.service"
以 root 身份运行时,出现以下错误:
Failed to connect to bus: No such file or directory
在 RHEL 8.4 系统上执行相同操作时,我没有收到此错误。我可以使用 runuser 以 mruser 身份运行 systemd --user 命令,没有任何问题。
已执行故障排除:
- 尝试
systemctl --user status myservice.service
按mruser
命令运行,没有错误。 - 我已经检查过 loginctl 了
mruser
,Linger=yes
- 检查以确保有一个
systemd --user
进程正在运行ps
- 使用单独的 ssh 会话直接登录到用户帐户,然后在原始会话中尝试以 root 身份执行相同的命令,仍然出现相同的错误。
mruser
已经export XDG_RUNTIME_DIR=/run/user/$(id -u)
~/.bashrc
- 尝试重新启动系统,仍然没有反应。
- 已读这个帖子,没有什么帮助。
在 RHEL 系统上,systemd 是 v239,在 Ubuntu 20.04 上是 v245。我是不是漏掉了什么?为什么我不能在 Ubuntu 上以 root 身份运行 systemd --user 命令?
runuser
更新:我认为问题与看不到导出的变量有关。这意味着$XDG_RUNTIME_DIR
无法识别或使用。有人知道为什么 runuser 没有看到文件中定义的导出变量吗mruser
?~/.bashrc
我检查了 RHEL 实例,root 能够查看和使用导出的变量。
答案1
我找到了问题所在。这是~/.bashrc
myuser 的文件。在 Ubuntu 上,默认.bashrc
文件包含以下行:
case $- in
*i*);;
*) return;;
esac
这不在 RHEL 默认.bashrc
文件中。此 case 语句正在寻找要使用的参数bash -i
。没有它,shell 就不是交互式的,也.bashrc
不会被使用,因此,定义$XDG_RUNTIME_DIR
永远不会被看到,因此systemd --user
命令会失败。
我还没有找到一种方法来runuser
强制这个案例陈述识别发送-i
。
解决方法:我使用此命令删除了以下行:
sed -i '/case $- in/,/esac/ s/^/# /' /home/mruser/.bashrc
完成此操作后,runuser
在 Ubuntu 上以 root 身份运行即可正常运行。如果有人知道如何让此 case 语句识别-i
,runuser
请分享,我会更新此解决方案。但目前这就是我正在做的事情。
答案2
Failed to connect to bus: No such file or directory
在 Ubuntu 20.04 上运行以下命令时我遇到了同样的错误( ):
systemctl --user mask tracker-store.service tracker-miner-fs.service tracker-miner-rss.service tracker-extract.service tracker-miner-apps.service tracker-writeback.service
问题是由于别名引起的:
alias systemctl='sudo systemctl'
它用 sudo 替换了systemctl
,sudo systemctl
从而导致了错误。