avahi-daemon能否在系统关机时发送mDNS服务“下线”广播通知?
Avahi 关机时广播服务下线通知解决方案
Avahi 默认本身就支持停止时主动广播所有已注册服务的下线(Goodbye)报文,不需要自己在应用层重新实现mDNS发布逻辑,绝大多数时候收不到下线通知是系统关机顺序导致的,Avahi 停止时网络已经被关停,报文无法发送。
方案1:调整默认配置即可实现(推荐)
- 第一步:确认Avahi主配置
/etc/avahi/avahi-daemon.conf中开启了下线报文发布,默认参数为publish-goodbye=yes,如果被修改过改回yes后重启avahi服务即可。 - 第二步:调整Avahi的systemd停止优先级,确保它在网络服务关停前执行停止逻辑:
执行systemctl edit avahi-daemon.service,在打开的编辑器中写入以下配置:
保存后执行[Unit] # 确保Avahi停止在网络服务停止之前执行 Before=network.target network-pre.target shutdown.target [Service] # 确保停止时执行完整的退出逻辑,发送所有服务的Goodbye报文 ExecStop=/usr/sbin/avahi-daemon -k TimeoutStopSec=5systemctl daemon-reload生效即可。
后续RPi关机时Avahi会先于网络停止,主动广播你在/etc/avahi/services/下配置的所有静态服务的下线通知,PC端的mDNS客户端就能触发下线回调。
方案2:自定义关机钩子手动触发下线
如果不想修改Avahi的默认服务配置,可以自己写一个systemd关机任务,在关机阶段主动注销服务:
- 新建脚本
/usr/local/bin/avahi-remove-services.sh,内容如下(把示例的服务名、类型、端口替换成你自己的配置):
给脚本加执行权限:#!/bin/bash # 注销对应服务,参数依次为 服务名 服务类型 端口 avahi-publish -R "我的自定义服务" _http._tcp 8080chmod +x /usr/local/bin/avahi-remove-services.sh - 新建systemd服务
/etc/systemd/system/avahi-goodbye.service:[Unit] Description=Send Avahi service goodbye packets on shutdown Before=network.target shutdown.target [Service] Type=oneshot ExecStart=/bin/true ExecStop=/usr/local/bin/avahi-remove-services.sh RemainAfterExit=yes [Install] WantedBy=multi-user.target - 执行
systemctl daemon-reload && systemctl enable avahi-goodbye.service生效即可。
方案3:应用层自行实现mDNS发布
如果确实需要在应用层控制服务的上下线,Node.js生态可以直接用bonjour或者mdns库,在应用中监听SIGTERM、SIGINT等系统关机信号,收到信号时主动调用库提供的服务注销方法即可,注意同样要保证应用的停止优先级高于网络服务,否则报文无法发出。
内容的提问来源于stack exchange,提问作者user9277612
相关产品推荐
相关产品推荐

