如何在 systemd 中为 CTRL-ALT-DEL 提供宽限期

如何在 systemd 中为 CTRL-ALT-DEL 提供宽限期

可以initctrlaltdel操作inittab指向任何命令,例如执行延迟关机命令。如何使用 Systemd 来实现这一点?

我有时使用控制台工作,在工作中被迫使用 Windows,当我的显示器空白时,我习惯于首先按下 CTRL-ALT-DEL - 这在 Linux 控制台上没有达到预期的效果!禁用它很容易,但如果发生非常糟糕的事情并且我无法登录,我仍然希望该键能够执行正常关机。

答案1

在 systemd 中,CTRL-ALT-DEL 键序列触发ctrl-alt-del.target(在 Debian 中,默认情况下位于系统路径/lib/systemd/system/ctrl-alt-del.target中) 并启动systemd-reboot.service。可以通过创建本地版本来覆盖它/etc/systemd/system/ctrl-alt-del.target。将其创建为空文件可有效禁用键序列。

安排将来重启的一种方法是让这个目标需要一项服务(例如,local-delayed-reboot.service在同一目录中创建文件)并将该服务配置为单次启动ExecStart=shutdown -r <delay>

这种方法让我感到烦恼的是,我们到处乱跑,ctrl-alt-del 触发 systemd 服务,该服务调用一个二进制文件,该二进制文件将 dbus 消息发送回 systemd 以安排关机(logind 处理它...)。我认为实际上继续启动同一目标可能会更简洁,但仅在执行 systemd 计时器之后。这是我实现它的方式:

创建一个警告服务 - 这是为了警告(wall如果没有人登录,则使用 + tee 控制台)即将发生重新启动。根据需要调整消息 - 特别是延迟:

/etc/systemd/system/local-delay-reboot-warn.service

[Unit]
Description=Reboot Warning

[Service]
Type=oneshot
ExecStart=/bin/sh -c '/bin/echo -e "\aCTRL-ALT-DEL has been hit! Reboot in 60 seconds...\n\nTo abort:\n  systemctl stop ctrl-alt-del.target"|tee /dev/console|/usr/bin/wall'

创建一个在指定时间后启动关闭单元的计时器 - 计时器依赖于警告服务,因此首先发出警告消息(同样,根据需要更新延迟):

/etc/systemd/system/local-delay-reboot.timer

[Unit]
Description=Reboot delay
DefaultDependencies=no
# Warn first...
Requires=local-delay-reboot-warn.service
After=local-delay-reboot-warn.service
# Make this timer stop if ctrl-alt-del.target is stopped
PartOf=ctrl-alt-del.target

[Timer]
OnActiveSec=60s
RemainAfterElapse=no
Unit=systemd-reboot.service
# Disable systemd's timer optimisations
AccuracySec=1us

[Install]
WantedBy=ctrl-alt-del.target

最后ctrl-alt-del.target用这个覆盖:

/etc/systemd/system/ctrl-alt-del.target

# Custom reboot action 

[Unit]
Description=Reboot (delayed)
DefaultDependencies=no
Requires=local-delay-reboot-warn.service local-delay-reboot.timer
After=systemd-reboot.service
AllowIsolate=yes
JobTimeoutSec=30min
JobTimeoutAction=reboot-force

[Install]
Alias=ctrl-alt-del.target

毕竟我不确定它是否真的值得,但它确实有助于了解如何使用计时器。

相关内容