Debian 9:如何设置仅在关机而非重启时触发的脚本?
解决Debian关机时触发智能插座延迟断电的方案
这问题我之前折腾过类似的家庭自动化场景,刚好能给你一套可靠的实现方案,核心是区分关机和重启操作,并在关机流程中触发通知脚本,具体步骤如下:
一、编写通知脚本
首先创建一个可执行脚本,用于判断当前操作类型并发送MQTT/curl请求:
- 创建脚本文件:
sudo nano /usr/local/bin/shutdown-notify.sh
- 写入以下内容(根据你的实际环境替换配置):
#!/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
- 给脚本添加执行权限:
sudo chmod +x /usr/local/bin/shutdown-notify.sh
二、通过Systemd挂载脚本(Debian 9+推荐)
现在Debian默认用Systemd管理服务,我们可以创建一个关机触发的service,确保脚本只在关机时运行:
- 创建Systemd服务文件:
sudo nano /etc/systemd/system/shutdown-notify.service
- 写入以下配置:
[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
- 重载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
相关产品推荐
相关产品推荐

