默认情况下,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
,那么您必须编辑此脚本以匹配。