长按电源按钮(而不是快速按下)关机背后的机制是什么?

长按电源按钮(而不是快速按下)关机背后的机制是什么?

可以使用 logind.conf 中的“HandlePowerKey”选项来控制电源按钮的行为。这被设置为“暂停”。只需轻按一下电源按钮即可按预期工作,暂停操作系统。然而,长按该按钮似乎会覆盖它并关闭计算机。这是如何发生的?

我问的原因是 /lib/systemd/system-sleep 中的脚本在长期保持电源时无法正确执行。

答案1

电源按钮由系统固件处理;典型配置如下:

  • 当按钮被按下时然后释放,固件甚至向操作系统发送电源,触发有序关闭或挂起;

  • 当按下按钮并且在几秒钟内没有释放时,固件会关闭系统电源而不通知操作系统。

这两个序列是非此即彼;系统不会被要求暂停然后关闭。这就是为什么长时间按住电源按钮时脚本不会运行的原因:操作系统永远不会发现这一点。

答案2

这里有两件事在起作用。

首先,正如斯蒂芬所建议的,主板的固件处理来自按钮的信号。根据您按下按钮的时间,固件将决定要做什么。

然后固件将向操作系统发送 ACPI 信号。快速按下电源按钮将发送电源按钮信号。按下复位按钮将发出复位信号。按住按钮将导致固件切断系统电源,而不向操作系统发送任何信号,这不会给操作系统时间有序关闭。换句话说,通常在关机时触发的所有脚本和触发器都不会触发,因为固件从未向操作系统发送信号。这解释了为什么您的脚本在长时间按下电源按钮时不起作用。

要控制行为,您需要配置操作系统处理 ACPI 关闭信号的方式。因此,如果您希望计算机挂起,您可以将操作系统配置为在按下电源按钮时挂起。

但在长按电源按钮的情况下,您没有机会控制任何东西,因为操作系统没有收到来自固件的信号。

如果您关注消息日志

sudo tail -f /var/log/messages 

查看按下电源按钮时登录的日志。在我的笔记本电脑(lenovo t14)和台式机(华硕主板)上,松开电源按钮后它们都会收到信号。

Aug 16 11:47:43 tp-01 systemd-logind[1508]: Power key pressed.

这是有道理的,因为主板的固件正在等待确定按压是长还是短。这也意味着,由于长按会立即切断系统电源,因此在松开按钮之前电源就会被切断,并且永远不会发送信号。

相关内容