如何(干净地)禁用电源按钮?

如何(干净地)禁用电源按钮?

默认情况下,Systemd 配置为在按下电源按钮时关闭计算机。我想保留这种行为,除非我的用户已登录。当我登录时,我想打开一个关闭对话框而不是立即关闭。

我已经实现了在用户服务中禁用systemd的处理,systemd-inhibit该服务在我登录时启动并在我注销时停止。这个方法效果很好,只不过我有一个空闲线程供调用sleep 1000d一直打开。

为了清洁,我正在寻找一种无需休眠线程即可实现此目的的方法,当我查看我的htop.

这是我的用户服务:

[Unit]
Description=User daemon to disable systemd's handling of the power button

[Service]
ExecStart=nohup systemd-inhibit \
                --what="handle-power-key" \
                --who="disable-shutdown-button script" \
                --why="allows i3 to open shutdown-dialog instead" \
                sleep 1000d

[Install]
WantedBy=default.target

编辑:登录是通过lightdm显示管理器完成的。

答案1

您可能希望将其添加到启动命令或对 GUI 登录会话至关重要的systemd-inhibit命令前面,而不是将其设置为单独的用户服务。i3

systemd-inhibit被设计为需要一个命令来运行它,因为目的是提供一种方法来抑制特定任务期间的挂起/休眠/关闭之类的事情,例如运行关键系统更新任务的包管理器,或刻录光盘这样,当需要它的任务结束或因任何原因中止时,抑制可以自动结束。

以这种方式添加systemd-inhibit到会话启动似乎是多余的,因为systemd/logind将通过控制组跟踪属于您的会话的进程,但这是我认为无需虚拟命令sleep或类似命令即可使使用模式适合的唯一方法。


在您提到的评论中,您使用了lightdm.它通常lightdm-session作为session-wrapper脚本运行。您可以修改此脚本,或将这样的覆盖文件放置到/etc/lightdm/lightdm.conf.d/.您可以自己选择名称,但名称应带有后缀.conf

[Seat:*]
session-wrapper=/usr/local/bin/shutdown-button-inhibit

脚本/usr/local/bin/shutdown-button-inhibit可能是这样的:

#!/bin/sh
if [ $(whoami) = "Julien" ]  # edit this to match your username
then
    exec systemd-inhibit \
        --what="handle-power-key" \
        --who="shutdown-button-inhibit script" \
        --why="allows i3 to open shutdown-dialog instead" \
        lightdm-session "$@"
else
    exec lightdm-session "$@"
fi

您应该将此脚本设置为可执行文件,扩展名为chmod 755 /usr/local/bin/shutdown-button-inhibit.

使用exec使脚本解释器替换自身,lightdm-session而不是作为另一个进程徘徊。

如果您的lightdm配置已自定义为调用 以外的其他内容lightdm-session,那么您必须编辑此脚本以匹配。

相关内容