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

Debian 9:如何设置仅在关机而非重启时触发的脚本?

解决Debian关机时触发智能插座延迟断电的方案

这问题我之前折腾过类似的家庭自动化场景,刚好能给你一套可靠的实现方案,核心是区分关机和重启操作,并在关机流程中触发通知脚本,具体步骤如下:

一、编写通知脚本

首先创建一个可执行脚本,用于判断当前操作类型并发送MQTT/curl请求:

  1. 创建脚本文件:
sudo nano /usr/local/bin/shutdown-notify.sh
  1. 写入以下内容(根据你的实际环境替换配置):
#!/bin/bash

# 获取当前运行级别:0=关机,6=重启,3/5=正常运行
RUNLEVEL=$(runlevel | awk '{print $2}')

# 仅在关机操作时执行(运行级别为0)
if [ "$RUNLEVEL" = "0" ]; then
    # 示例1:发送MQTT消息(需先安装mosquitto-clients)
    mosquitto_pub -h 你的MQTT服务器IP/域名 -p 1883 -t "home/smartplug/command" -m "delayed_poweroff"
    # 如果需要认证,添加 -u 用户名 -P 密码

    # 示例2:发送HTTP请求(用curl)
    # curl -X POST "http://你的自动化服务器地址/api/plug" -d '{"action": "delayed_off", "delay": 10}'

    # 给服务器和主机预留关机缓冲时间(可根据你的主机调整时长)
    sleep 10
fi
  1. 给脚本添加执行权限:
sudo chmod +x /usr/local/bin/shutdown-notify.sh

二、通过Systemd挂载脚本(Debian 9+推荐)

现在Debian默认用Systemd管理服务,我们可以创建一个关机触发的service,确保脚本只在关机时运行:

  1. 创建Systemd服务文件:
sudo nano /etc/systemd/system/shutdown-notify.service
  1. 写入以下配置:
[Unit]
Description=Send shutdown notification to home automation server
DefaultDependencies=no
Before=shutdown.target halt.target
# 确保脚本在关机流程早期执行,但不干扰重启

[Service]
Type=oneshot
ExecStart=/usr/local/bin/shutdown-notify.sh
TimeoutStartSec=0

[Install]
WantedBy=shutdown.target halt.target
  1. 重载Systemd配置并启用服务:
sudo systemctl daemon-reload
sudo systemctl enable shutdown-notify.service

三、关键细节说明

  • 区分关机/重启:通过RUNLEVEL判断是最直接的方式,0对应关机,6对应重启,确保重启时不会触发插座断电。
  • 缓冲时间:脚本里的sleep 10是为了让主机完成关机流程,同时给家庭自动化服务器足够时间处理指令,避免主机还没断电就被插座切断电源。
  • 依赖安装:如果用MQTT,需要先安装客户端:sudo apt install mosquitto-clients;用curl的话一般系统自带,没有的话安装:sudo apt install curl。
  • 测试验证:
    • 手动运行脚本测试能否正常发送消息:sudo /usr/local/bin/shutdown-notify.sh
    • 测试关机触发:sudo systemctl halt,查看自动化服务器是否收到指令
    • 测试重启不触发:sudo systemctl reboot,确认没有发送断电指令

内容的提问来源于stack exchange,提问作者oTTo001

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:07:17