在不使用桌面环境或会话管理器的情况下,如何告诉 systemd-logind 会话未空闲?

在不使用桌面环境或会话管理器的情况下,如何告诉 systemd-logind 会话未空闲?

我想用于logind电源管理。 30 分钟不活动后,我希望计算机暂停。

问题是,现在,即使我正在使用鼠标和键盘,它也会在 30 分钟后暂停。我的logind.conf

[Login]
HandlePowerKey=suspend
IdleAction=suspend
IdleActionSec=30min

我的 Ubuntu 15.04 设置非常少,我想保持这种状态。我在控制台登录(我不需要会话管理器),然后键入startx,这会启动我~/.xinitrci3首选窗口管理器。我不想使用桌面环境。

我希望计算机在给定时间后挂起并锁定。

所以,我的~/.config/i3/config文件包括:

exec "xss-lock -- i3lock -c 000000"

屏幕锁工作正常,并且集成良好。所以那里没有问题。

如果您感兴趣:

loginctl show-seat -p IdleHint

产量:

IdleHint=yes

如果我主动的话,似乎应该是“不”,对吗?

如果我这样做:

gdbus call --system --dest org.freedesktop.login1 --object-path /org/freedesktop/login1/session/c1 --method org.freedesktop.login1.Session.SetIdleHint false

或这个:

dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1/session/c1 "org.freedesktop.login1.Session.SetIdleHint" boolean:false

读取 IdleHint 仍然输出“IdleHint=yes”!

那么我错过了什么?在不使用会话管理器或桌面环境的情况下,如何systemd-logind在活动时避免挂起?

lxqt-powermanagement例如,我知道我可以使用,但我认为我认为这是不必要的是正确的。当然,我可以更改我对桌面环境的个人偏好,并且如果有必要的话也会这样做。不过,这个问题似乎是可以解决的。

答案1

当我做

dbus-send --system --print-reply \
  --dest=org.freedesktop.login1 /org/freedesktop/login1/session/self \
  "org.freedesktop.login1.Session.SetIdleHint" boolean:false

我明白了

Error org.freedesktop.DBus.Error.NotSupported: Idle hint control is not supported on non-graphical sessions.

这表明问题是登录时认为会话不是图形的。的确:

$ loginctl show-session --property=Type self
Type=tty

这就是使用 sddm 有所帮助的原因:它设置会话类型。

但是我们可以手动设置会话类型吗?

org.freedesktop.login1(5)说:

SetType() 允许动态更改会话类型。它只能由会话的当前控制器调用。如果尚未调用 TakeControl(),则此方法将失败。此外,一旦释放控制(通过调用 ReleaseControl() 或关闭 D-Bus 连接),会话类型将重置为其原始值。这应该有助于防止会话进入不一致的状态,例如控制器崩溃。唯一的参数类型是新的会话类型。

Xorg服务器成为会话控制器但没有设置类型,因此可能无法在其他地方(xinitrc、xsession 或类似的东西)设置它,因为只有会话控制器可以做到这一点。

但是有一种有点黑客的方法可以做到这一点,通过$XDG_SESSION_TYPE设置pam_systemd(8)。我尝试将其放入:/etc/systemd/system/[email protected]/override.conf

[Service]
Environment=XDG_SESSION_TYPE=x11

现在,当我登录 vt10 和 时exec startx /etc/X11/Xsession,IdleHint 可以更新,并且确实由 xss-lock 更新。

为了使其更加健壮,我的 .bash_profile 检查$XDG_SESSION_TYPE会话是否是主要的(只有一个会话应该将其环境变量推送到用户 systemd 实例)并启动 X,将 vt10 变成一个非常简单的桌面管理器。 :-)

#!bash

if [[ ! $DISPLAY && $XDG_SESSION_TYPE == "x11" ]]; then
        [[ "$(loginctl show-user --property=Display "$USER")" == "Display=$XDG_SESSION_ID" ]] && primary=: || primary=
        journal=(/usr/bin/systemd-cat --priority=info --stderr-priority=warning --level-prefix=false)
        [[ $primary ]] && session=(/etc/X11/xinit/xinitrc) || session=(~/.xsession)

        exec startx "${journal[@]}" "${session[@]}"
        exit 1
fi

. ~/.bashrc

答案2

可悲的是,缺乏答案可能意味着不存在答案。不过很高兴犯错!

对于那些可能正在研究同样事情的人,我最终屈服并正在使用会话管理器。具体来说,sddm。现在,一切似乎都工作正常,并且会话管理器实际上并不太臃肿,而且几乎不妨碍操作。

相关内容