sxc*_*731 7 gnome gdm suspend gnome-settings-daemon systemd-logind
我非常肯定这曾经在 19.04(和过去的版本)中可以完美运行,但在发布升级到 19.10(内核 5.3.0-24,ThinkPad X1 Carbon gen 5,以防万一)后不再有效。
我在 GNOME-Tweaks 中设置了相应的开关,并且还尝试/etc/systemd/logind.conf按照此处的建议进行手动编辑,即取消注释并调整以下几行,然后重新启动:
$ grep -v '^#' /etc/systemd/logind.conf
[Login]
HandleLidSwitch=suspend
HandleLidSwitchExternalPower=suspend
HandleLidSwitchDocked=suspend
LidSwitchIgnoreInhibited=yes
Run Code Online (Sandbox Code Playgroud)
(严格来说,应该只需要第一个,但为了以防万一,我还添加了第 2 行和第 3 行,以及第 4 行,以便更好地衡量...
查看 的输出systemctl status systemd-logind,我看到以下内容:
Dec 17 17:56:50 x1c5 systemd-logind[8959]: Lid closed.
Dec 17 17:57:03 x1c5 systemd-logind[8959]: Lid opened.
Run Code Online (Sandbox Code Playgroud)
所以盖子事件被正确检测到。为了排除挂起过程本身的任何问题,为了测试目的,我还在设置->电源->挂起和电源按钮中将我的电源按钮设置为挂起。现在按下电源按钮会导致输出systemctl status systemd-logind(在成功的挂起-恢复循环之后):
Dec 17 18:13:58 x1c5 systemd-logind[8959]: Power key pressed.
Dec 17 18:14:28 x1c5 systemd-logind[8959]: Delay lock is active (UID 121/gdm, PID 9215/gsd-power) but inhibitor timeout is reached.
Dec 17 18:14:39 x1c5 systemd-logind[8959]: Operation 'sleep' finished.
Run Code Online (Sandbox Code Playgroud)
底线:正确检测到盖子事件并且暂停工作完美无缺 - 但不是在盖子关闭时......
知道如何让关闭盖子的暂停功能恢复生机吗?我当然可以使用电源按钮的解决方法,但它有点太容易忘记并导致笔记本电脑在包中过热等......
--- 编辑添加---
得到了这张票的进一步礼貌,尽管问题与描述的不完全一样。这是一个吸烟枪:
$ systemd-inhibit --list --mode=block
WHO UID USER PID COMM WHAT WHY MODE
gdm 121 gdm 2231 gsd-power handle-lid-switch External monitor attached or configuration changed recently block
gdm 121 gdm 2252 gsd-media-keys handle-power-key:handle-suspend-key:handle-hibernate-key GNOME handling keypresses block
user 1000 user 3017 gsd-media-keys handle-power-key:handle-suspend-key:handle-hibernate-key GNOME handling keypresses block
Run Code Online (Sandbox Code Playgroud)
这表明盖子关闭操作被阻止,因为“最近连接了外部监视器或配置更改”。我确实使用 USB-C 电缆将我的笔记本电脑连接到显示器,但在我写这篇文章时,它已经断开连接并靠电池运行了近 3 个小时(GNOME 设置只显示我的笔记本电脑显示器可用)。但是,看起来 systemd 或对此负责的任何组件仍然错误地认为附加了外部显示器,并且 - 根据票证 - 在这种情况下,GNOME 不支持挂起......
有趣的是,gsd-power进程 (PID 2231) 归gdm我而不是我的 UID 所有。杀死它会恢复 suspend-on-lid-close 功能。需要弄清楚为什么这个进程存在......当实际连接到外部显示器时,systemd-inhibit --list --mode=block报告gsd-power交互用户拥有的第二个进程;这看起来是正确和充分的。
根据问题末尾的调查,该问题似乎是由 GDM 运行冗余gsd-power进程引起的。一旦你登录就可以简单地杀死它。我是这样做的:
创建一个kill脚本如下:
script=~/bin/kill_gdm_gsd-power.sh
cat > $script << EOF
#!/bin/sh
sudo pkill -u gdm gsd-power
EOF
chmod 755 $script
Run Code Online (Sandbox Code Playgroud)您的帐户需要被允许sudo pkill在没有密码提示的情况下运行(确保您对此感到满意)。运行sudo visudo -f /etc/sudoers.d/NOPASSWD并输入以下内容
Cmnd_Alias PKILL = /usr/bin/pkill
user ALL=(ALL) NOPASSWD: PKILL
Run Code Online (Sandbox Code Playgroud)
(将user上面替换为您自己的用户 ID)
打开 GNOME 启动应用程序小程序 ( gnome-session-properties) 并添加一个带有脚本的条目,以便它在您登录后立即运行。
理想情况下,我们会找到一种方法来gsd-power完全阻止启动,但我发现这并不简单......如果您找到更好的方法,请参与进来。
一个稍微干净的解决方案可能是handle-lid-switch根据此解决方案编写自定义脚本,但该脚本主要必须为gdm用户安装,这也可能不是微不足道的......
终止 gdm 进程可能会产生一些副作用gsd-power,例如:如果您注销并将笔记本电脑留在 GDM 问候屏幕,但我认为这不是我们许多人会遇到的情况。