You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下监听关机信号并执行任务的.service配置求助

解决方案:持续监听关机信号的systemd服务

现有配置的问题

你当前的.service使用Type=oneshot+RemainAfterExit=true,本质是一次性执行的任务:服务执行一次后会保持激活状态,即便取消关机,systemd也会认为该服务已经完成,下次触发关机时不会再次执行。同时绑定shutdown.target的逻辑,仅在关机流程启动时触发一次,无法满足“取消关机后仍能再次响应”的需求。


正确的实现方案

我们需要创建一个长期后台运行的服务,通过监听系统关机事件而非依赖shutdown.target来触发脚本,这样无论取消多少次关机,服务始终处于运行状态,能持续响应后续的关机信号。

1. 修改.service配置文件

创建/etc/systemd/system/shutdown-listener.service,内容如下:

[Unit]
Description=Persistent Shutdown Trigger Listener
After=multi-user.target

[Service]
Type=simple
ExecStart=/home/y3qucfm/workspace/on_boot/check_pwr.sh
Restart=always
RestartSec=1
User=y3qucfm  # 替换为你的实际用户名,避免权限问题
StandardOutput=journal+console

[Install]
WantedBy=multi-user.target
  • Type=simple:表示服务是长期运行的前台进程(脚本会持续运行)
  • Restart=always:确保脚本意外退出后自动重启,保证服务始终在线
  • After=multi-user.target:在多用户环境启动后再启动服务,避免依赖问题

2. 重写check_pwr.sh脚本

脚本需要持续监听系统的关机事件,这里推荐通过dbus-monitor监听logind的标准关机信号,能覆盖物理按键、命令行关机(shutdown/reboot)等所有场景:

#!/bin/bash

# 关机触发时执行的逻辑
handle_shutdown() {
    local timestamp=$(date +"%Y-%m-%d %T")
    echo "$timestamp - System is preparing to shut down" >> /home/workspace/on_boot/pwr.log
    python3 /home/workspace/on_boot/on_key.py
}

# 持续监听logind的PrepareForShutdown信号
dbus-monitor --system "type='signal',interface='org.freedesktop.login1.Manager',member='PrepareForShutdown'" | while read -r line; do
    # 仅在关机开始(参数为true)时执行逻辑
    if echo "$line" | grep -q "boolean true"; then
        handle_shutdown
    fi
done

如果不想依赖dbus,也可以用信号捕捉的方式(兼容性稍差,但更简单):

#!/bin/bash

handle_shutdown() {
    local timestamp=$(date +"%Y-%m-%d %T")
    echo "$timestamp - System is starting shutdown process" >> /home/workspace/on_boot/pwr.log
    python3 /home/workspace/on_boot/on_key.py
}

# 捕捉关机相关的系统信号
trap 'handle_shutdown; wait' SIGTERM SIGINT SIGQUIT

# 让脚本持续运行(休眠减少资源占用)
while true; do
    sleep 3600
done

3. 部署与测试步骤

  1. 赋予脚本执行权限:
chmod +x /home/y3qucfm/workspace/on_boot/check_pwr.sh
  1. 重新加载systemd配置并启动服务:
sudo systemctl daemon-reload
sudo systemctl enable --now shutdown-listener.service
  1. 测试验证:
    • 执行sudo shutdown -h +1触发关机,查看日志文件/home/workspace/on_boot/pwr.log是否有记录
    • 执行sudo shutdown -c取消关机
    • 再次触发关机,确认日志中会新增第二次记录,证明服务可重复响应

内容的提问来源于stack exchange,提问作者Adriana Treviño

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 13:17:15