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. 部署与测试步骤
- 赋予脚本执行权限:
chmod +x /home/y3qucfm/workspace/on_boot/check_pwr.sh
- 重新加载systemd配置并启动服务:
sudo systemctl daemon-reload sudo systemctl enable --now shutdown-listener.service
- 测试验证:
- 执行
sudo shutdown -h +1触发关机,查看日志文件/home/workspace/on_boot/pwr.log是否有记录 - 执行
sudo shutdown -c取消关机 - 再次触发关机,确认日志中会新增第二次记录,证明服务可重复响应
- 执行
内容的提问来源于stack exchange,提问作者Adriana Treviño
相关产品推荐
相关产品推荐

