我在Dell E6530笔记本电脑上的Arch Linux 4.2.5-1-ARCH x86_64上使用GNOME 3.18.1。自从几年前安装此操作系统以来,笔记本电脑上的电源按钮一直使我的操作系统完全关机。
但是,在过去的几周中,这种行为已经改变,因此现在按下电源按钮可使笔记本电脑进入节能模式。我没有更改电源设置。我始终使用来更新系统pacman -Syyu
,因此,我怀疑有更新更改了此功能。
在电源设置中,没有此选项。
如何恢复初始行为,以便按该按钮可以关闭系统电源?
我在Dell E6530笔记本电脑上的Arch Linux 4.2.5-1-ARCH x86_64上使用GNOME 3.18.1。自从几年前安装此操作系统以来,笔记本电脑上的电源按钮一直使我的操作系统完全关机。
但是,在过去的几周中,这种行为已经改变,因此现在按下电源按钮可使笔记本电脑进入节能模式。我没有更改电源设置。我始终使用来更新系统pacman -Syyu
,因此,我怀疑有更新更改了此功能。
在电源设置中,没有此选项。
如何恢复初始行为,以便按该按钮可以关闭系统电源?
Answers:
这是由最新gnome-settings-daemon
更新引起的... 电源设置中
没有这样的选项,因为GNOME开发人员已将其删除(该操作被认为是“破坏性太大”)。
底线:您无法再通过按电源关闭按钮来关闭笔记本电脑的电源。shutdown/power off
但是,如果您愿意进行修补和重建,则可以在设置守护进程电源插件中添加一个新的dconf
/ gsettings
选项(即shutdown
)gnome-settings-daemon
:
--- gnome-settings-daemon-3.18.2/data/gsd-enums.h 2015-11-10 09:07:12.000000000 -0500
+++ gnome-settings-daemon-3.18.2/data/gsd-enums.h 2015-11-11 18:43:43.240794875 -0500
@@ -114,7 +114,8 @@
{
GSD_POWER_BUTTON_ACTION_NOTHING,
GSD_POWER_BUTTON_ACTION_SUSPEND,
- GSD_POWER_BUTTON_ACTION_HIBERNATE
+ GSD_POWER_BUTTON_ACTION_HIBERNATE,
+ GSD_POWER_BUTTON_ACTION_SHUTDOWN
} GsdPowerButtonActionType;
typedef enum
--- gnome-settings-daemon-3.18.2/plugins/media-keys/gsd-media-keys-manager.c 2015-11-10 09:07:12.000000000 -0500
+++ gnome-settings-daemon-3.18.2/plugins/media-keys/gsd-media-keys-manager.c 2015-11-11 18:47:52.388602012 -0500
@@ -1849,6 +1849,9 @@
action_type = g_settings_get_enum (manager->priv->power_settings, "power-button-action");
switch (action_type) {
+ case GSD_POWER_BUTTON_ACTION_SHUTDOWN:
+ do_config_power_action (manager, GSD_POWER_ACTION_SHUTDOWN, in_lock_screen);
+ break;
case GSD_POWER_BUTTON_ACTION_SUSPEND:
do_config_power_action (manager, GSD_POWER_ACTION_SUSPEND, in_lock_screen);
break;
安装修补程序版本后,在org> gnome> settings-daemon>插件> power> power-button-action下shutdown
将提供一个新选项:dconf-editor
因此,请选择通过电源按钮关闭它,或者,如果您更喜欢CLI,请在终端中运行:
gsettings set org.gnome.settings-daemon.plugins.power power-button-action shutdown
当然,要使以上各项正常工作,您还需要在中进行正确的设置/etc/systemd/logind.conf
:
HandlePowerKey=poweroff
PowerKeyIgnoreInhibited=yes
请记住,按电源按钮将在没有任何警告的情况下关闭系统。
gsd-enums.h
位于文件夹中/usr/include/gnome-settings-daemon-3.0/gnome-settings-daemon/
,gsd-media-keys-manager.c
根本不存在。
正如@don_crissti所解释的,这种情况很愚蠢,因为在没有使用正常设置进行确认的情况下,真的不可能仅关机。
但是,有一种解决方法:如果计算机的机箱类型设置为“ vm”(虚拟机),则旧的立即关闭行为将接管所有设置。只需以root身份输入:
hostnamectl set-chassis vm
然后重启一次。我不知道此设置有任何副作用。
在Ubuntu 18.04或任何类似的Linux与ACPI变种(如果没有可以或许安装),创建一个名为文件/etc/acpi/events/power
与
sudo nano /etc/acpi/events/power
并把
event=button/power
action=/sbin/poweroff
在文件中,将其关闭,然后
sudo service acpid restart
这可能是绝对有效的最简单的解决方案。
我找到了另一个在Debian Stretch上完成此操作的选项。我安装了软件包acpi-support-base
并编辑了文件/etc/acpi/powerbtn-acpi-support.sh
,在标题注释之后和任何代码之前添加了以下几行。
## Bypass logic to force shutdown on power button
/sbin/shutdown -h -P now "Power button pressed"
exit 0
这有点钝,但在台式机上对我有用,在笔记本电脑上也可以。它还绕过了Gnome3设置,但是比修补Gnome和重新编译要容易得多。
根据Arch Wiki页面上的内容,acpid
可以通过/etc/acpi/handler.sh
在Arch上进行修改来实现。
我通过监视以下服务器的日志输出在我的服务器上解决了此问题: systemd-logind
基本上是在完善其他答案中提出的解决方案。
此解决方法需要两个文件。触发实际关机事件的脚本
$ cat /usr/local/bin/shutdown_button_monitor.sh
#!/bin/sh
# ansible managed
# systemd-logind prints a line of the form
# Dez 21 11:12:10 box03.yeepa.de systemd-logind[748]: Power key pressed.
# on key press, but doesn't handle the button because gnome3 blocks systemd from doing so.
# See `systemd-inhibit` for that.
# first sleep a minute so we have chance to disable this scritp if it runs amok
sleep 1m
# so we workaround gnome a bit here.
journalctl -u systemd-logind --follow --lines=0 | \
while read line ; do
if echo "$line" | grep --quiet 'Power key pressed'
then
systemctl poweroff
fi
done
以及启动/重新启动它的服务文件
$ cat /etc/systemd/system/shutdown_button_monitor.service
# ansible managed
[Unit]
Description=Power off the machine if the power button is pressed
# Workaround for gnomes block of the shutdown button
# /unix/242129/gnome-3-how-to-set-power-button-to-shutdown-instead-of-suspend#242452
# Monitor these blocks yourself with `systemd-inhibit`
[Service]
User=root
ExecStart=/usr/local/bin/shutdown_button_monitor.sh
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target