我想用于logind
电源管理。 30 分钟不活动后,我希望计算机暂停。
问题是,现在,即使我正在使用鼠标和键盘,它也会在 30 分钟后暂停。我的logind.conf
:
[Login]
HandlePowerKey=suspend
IdleAction=suspend
IdleActionSec=30min
我的 Ubuntu 15.04 设置非常少,我想保持这种状态。我在控制台登录(我不需要会话管理器),然后键入startx
,这会启动我~/.xinitrc
的i3
首选窗口管理器。我不想使用桌面环境。
我希望计算机在给定时间后挂起并锁定。
所以,我的~/.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 有所帮助的原因:它设置会话类型。
但是我们可以手动设置会话类型吗?
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
。现在,一切似乎都工作正常,并且会话管理器实际上并不太臃肿,而且几乎不妨碍操作。