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

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=5
    
    保存后执行 systemctl 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 8080
    
    给脚本加执行权限:chmod +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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:06:08