设备Station模式systemd服务启动后wlan0自动断开问题求助
我之前碰到过几乎一模一样的情况:手动跑命令或脚本联网完全正常,用systemd启动就触发本地主动断开(就是你日志里的DEAUTH_LEAVING)。结合你的配置和日志,大概率是systemd的服务生命周期管理、脚本进程后台逻辑不匹配,或者有隐藏的网络服务干扰导致的,给你几个实用的排查和解决方向:
1. 调整systemd服务的进程管理逻辑
你的服务用了Type=simple,但脚本里的wpa_supplicant加了-B(后台运行),dhclient默认也是后台进程——这会让systemd误以为脚本执行完就退出了,可能触发意外的进程清理动作,甚至误杀关联的网络进程。
修改station.service配置:
[Unit] Description=station mode service. After=network.target Wants=network.target [Service] Type=forking # 让systemd识别后台进程的启动状态 ExecStart=/home/root/station_mode.sh # 停止服务时主动清理相关进程,避免残留 ExecStop=/usr/bin/killall wpa_supplicant dhclient ExecStopPost=/sbin/ip addr flush dev wlan0 # 网络异常时自动重启服务 Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target
同步修改station_mode.sh脚本:
去掉wpa_supplicant的-B参数,让它前台运行(交给systemd管理后台),同时等待关联成功再启动dhclient,避免时序问题:
#!/bin/bash rfkill unblock all # 去掉-B,让wpa_supplicant前台运行,由systemd托管后台 /home/root/wpa_supplicant -Dnl80211 -iwlan0 -c/etc/wpa_supplicant.conf & # 等待wlan0完成关联,避免dhclient提前启动失败 until wpa_cli -iwlan0 status | grep -q "wpa_state=COMPLETED"; do sleep 1 done dhclient -i wlan0
2. 排查是否有其他网络服务干扰
虽然你停了默认的wpa_supplicant,但可能还有NetworkManager这类网络管理服务在后台运行,它们会自动接管wlan0接口,导致你的脚本启动的连接被强制断开。执行以下命令确认:
systemctl status NetworkManager
如果它在运行,直接停止并禁用:
systemctl stop NetworkManager systemctl disable --now NetworkManager
3. 确保脚本权限和环境一致性
systemd服务的默认环境变量和你手动登录的命令行环境不一样,比如PATH、用户权限等。先给脚本加上执行权限:
chmod +x /home/root/station_mode.sh
另外把脚本开头的#!/bin/sh改成#!/bin/bash,bash的兼容性更好,能避免一些shell语法差异导致的问题。
4. 查看详细日志定位问题
如果调整后还是有问题,用journalctl查看服务的实时日志,能找到脚本执行时的具体错误:
journalctl -u station.service -f
比如可能是rfkill命令找不到、wpa_supplicant.conf权限不足,或者dhclient获取IP超时等问题,都能从日志里看出来。
最后验证修改
调整完配置后,重新加载systemd并重启服务:
systemctl daemon-reload systemctl restart station.service
然后用以下命令确认网络状态:
iw wlan0 link ip addr show wlan0
内容的提问来源于stack exchange,提问作者Sourabrt

