可以init
将ctrlaltdel
操作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
毕竟我不确定它是否真的值得,但它确实有助于了解如何使用计时器。