按照这个答案,我在无头系统上为用户启用了延迟。但是在 中loginctl list-sessions
,用户尚未列出。如果我通过 ssh 使用该用户登录,它会显示,一旦我再次断开连接,它就会丢失。
如何在不重新启动整个系统的情况下生成延迟会话
我尝试过但没有成功systemctl restart systemd-logind
。
编辑:我的目标是运行由该用户控制的计时器。如果我sudo -iu
在启用延迟后在 shell 中尝试此形式,则会收到以下错误:
$ systemctl --user status servicename
Failed to connect to bus: No such file or directory
如果我通过 ssh 登录(并且在 loginctl 中显示一个会话),它会按预期工作。但现在我注意到它只能在 ssh shell 中工作,仍然不能在sudo
shell 中工作。所以它实际上可能与会话无关。
答案1
您在这里混淆了“用户”和“会话”。
使用loginctl enable-linger myuser
将使用户的用户管理器myuser
在启动时启动(如果尚未启动,则立即启动),但它不会真正为用户启动任何会话(这些会话仅在用户登录时发生。)
如果您使用该loginctl list-users
命令,您将看到它的效果。您还可以在启用 linger 后立即ps -fu myuser
查看用户管理器 ( ) 正在为您的用户运行:systemd --user
[root@myhost ~]# loginctl list-users
UID USER
0 root
1 users listed.
[root@myhost ~]# ps -fu myuser
UID PID PPID C STIME TTY TIME CMD
[root@myhost ~]# loginctl enable-linger myuser
[root@myhost ~]# ps -fu myuser
UID PID PPID C STIME TTY TIME CMD
myuser 12345 1 20 18:44 ? 00:00:00 /usr/lib/systemd/systemd --user
myuser 12349 12345 0 18:44 ? 00:00:00 (sd-pam)
[root@myhost ~]# loginctl list-users
UID USER
0 root
1001 myuser
2 users listed.
但不存在新会话myuser
,因为它没有通过控制台、GUI 或 SSH 登录:
[root@myhost ~]# loginctl list-sessions
SESSION UID USER SEAT TTY
1 0 root tty0
1 sessions listed.
但无论会话如何,用户管理器都会启动,因此如果您的用户有用户单元(例如服务或计时器),那么无论用户是否已登录或创建会话,这些单元都会在启动时启动。
我希望这能向你解释。
更新:从您对问题的编辑来看,您真正遇到的麻烦似乎是systemctl --user
从sudo -i
shell 而不是 SSH 会话运行命令。
XDG_RUNTIME_DIR
您可以通过在切换到用户后导出来解决此问题,例如:
$ export XDG_RUNTIME_DIR=/run/user/$UID
或者:
$ XDG_RUNTIME_DIR=/run/user/$UID systemctl --user status servicename
通过 SSH 登录时不需要这样做的原因是 SSH 将使用 PAM 对您进行身份验证,并且 PAM 模块之一将为您设置这些环境变量。如果您使用sudo
,则不会通过 PAM(至少不是完整的 PAM 堆栈),因此您无法正确设置这些内容。