Red Hat Enterprise Linux 8.2下如何通过命令行取消gnome-session-quit --power-off触发的关机
我之前碰到过一模一样的情况——直接终止gnome-session-quit --power-off的进程根本没用,因为这个命令只是给系统发了个关机触发信号,实际的倒计时和关机调度是由logind和GNOME会话管理器负责的,等你去杀进程的时候,它可能早就完成任务退出了,自然影响不了已经在走的关机流程。
下面是两个经过验证的可行方案,再结合电源状态检测,就能实现“接通电源自动取消关机”的需求:
方案1:用loginctl直接终止关机请求
loginctl是系统里管电源、会话的核心工具,所有关机、重启请求最终都要经过它处理。要取消正在倒计时的关机,直接执行这条命令就行:
loginctl cancel shutdown
执行后会立刻终止logind里的关机倒计时流程,效果和你手动点“取消”完全一样。
方案2:通过DBus调用GNOME会话接口取消
如果你的系统是纯GNOME环境,也可以直接调用GNOME会话管理器的DBus接口来取消注销/关机请求:
gdbus call --session --dest org.gnome.SessionManager --object-path /org/gnome/SessionManager --method org.gnome.SessionManager.CancelLogout
这条命令会直接给GNOME会话管理器发取消信号,能覆盖GNOME环境下所有注销、关机的倒计时场景。
自动触发:结合电源状态实现无人干预取消
要实现“一接通电源就自动取消关机”,可以用udev规则监听电源状态变化,配合脚本自动执行取消操作:
步骤1:创建自动取消脚本
新建/usr/local/bin/cancel-shutdown-on-ac.sh,内容如下:
#!/bin/bash # 读取电源接通状态:1代表已接通电源,0代表未接通 AC_ONLINE=$(cat /sys/class/power_supply/AC/online) if [ "$AC_ONLINE" -eq 1 ]; then # 优先用loginctl取消关机,覆盖系统级别的请求 loginctl cancel shutdown # 补充调用GNOME会话接口,确保GNOME层面的倒计时也被取消 gdbus call --session --dest org.gnome.SessionManager --object-path /org/gnome/SessionManager --method org.gnome.SessionManager.CancelLogout >/dev/null 2>&1 fi
给脚本加上执行权限:
chmod +x /usr/local/bin/cancel-shutdown-on-ac.sh
步骤2:创建udev规则监听电源变化
新建/etc/udev/rules.d/99-power-shutdown-cancel.rules,内容:
SUBSYSTEM=="power_supply", KERNEL=="AC", ACTION=="change", RUN+="/usr/local/bin/cancel-shutdown-on-ac.sh"
这个规则会在电源适配器的连接状态发生变化时,自动触发我们的脚本。
步骤3:加载规则并测试
执行以下命令让udev加载新规则:
udevadm control --reload-rules && udevadm trigger
现在可以测试:先执行gnome-session-quit --power-off触发关机倒计时,然后接通电源,系统会自动取消关机,完全不用手动操作。
内容的提问来源于stack exchange,提问作者rrrrTTTrrrr

