我有一台 Ubuntu 机器,运行着一个需要互联网的软件。但是,有时 wifi 会失败(例如路由器重启)并且无法再次找到网络,直到我手动重启服务网络管理器或关闭并打开 wifi 才能找到它。
是否有可能运行 cron 作业或 Supervisord 作业来监控连接性,如果找不到网络,则重新启动网络管理器服务并连接到该特定的 SSID?
答案1
我认为这可能是由于新的网络管理器错误造成的,因为我最近也开始遇到这个问题 - 我想是在升级到 Ubuntu 15.04 之后。
我似乎已经设法通过以下两个文件暂时解决了这个问题:
- 我有一个脚本文件来监视 WiFi 连接,并在断开连接时打开和关闭 WiFi,例如
~/.bin/WiFi-Keep-Connected
,内容如下:
#!/bin/bash
while true; do
LC_ALL=C nmcli -t -f TYPE,STATE dev | grep "^wifi:disconnected$"
if [ $? -eq 0 ]; then
rfkill block wifi && rfkill unblock wifi
sleep 10
fi
sleep 10
done
- 我还有一个 .desktop 文件,以使该脚本在每次登录时运行,例如
~/.config/autostart/KeepWifiConnected.desktop
,内容如下:
[Desktop Entry]
Type=Application
Exec=/home/"username"/.bin/WiFi-Keep-Connected
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=Keep WiFi Connected
Icon=networkmanager
注意:您需要在Exec=
上面给出的路径中输入您的用户名。
注意:有时重启 Wi-Fi这种方式还不够,在这种情况下我必须重新启动网络管理器从终端输入此命令一次甚至两次:sudo service network-manager restart
因此,这可能是更好的修改上述脚本的想法(以防万一)如下:
#!/bin/bash
while true; do
LC_ALL=C nmcli -t -f TYPE,STATE dev | grep "^wifi:disconnected$"
if [ $? -eq 0 ]; then
rfkill block wifi && rfkill unblock wifi
sleep 10
fi
LC_ALL=C nmcli -t -f TYPE,STATE dev | grep "^wifi:disconnected$"
if [ $? -eq 0 ]; then
gksudo service network-manager restart
sleep 10
fi
sleep 10
done
答案2
我不知道为什么,但是正如你提到的,有时当 wifi 出现故障时,网络管理器无法再次找到网络。
我认为问题在于,在 wifi 连接失败后,网络管理器不会刷新 wifi 列表(而且网络管理器似乎隐藏了有问题的网络)。网络管理器没有重新扫描菜单选项,并且在网络管理器菜单上禁用和启用无线复选框不会强制进行新的 wifi 扫描(重新启动服务会强制进行)。
当网络管理器失去我的无线连接并且它再次找不到我的 wifi(并且我知道 wifi 可以运行)时,我执行以下命令:
sudo iwlist wlan0 scan
它在 wlan0 接口上执行 wifi 扫描(wlan0 是我的笔记本电脑中无线接口的名称),并显示可用的无线网络,但副作用是网络管理器会自动刷新其列表并找到丢失的网络。
当出现此问题时,我更喜欢手动执行命令(网络重新连接并不能确保恢复通信,并且某些程序需要重新启动)。
但是,正如您所提到的,您可以对其进行 cron 操作,并且可以在不测试连接的情况下执行此操作(扫描过程会更新您的 wifi 列表,但如果您已连接,它不会关闭您当前的无线连接)。
如果您愿意,您可以使用 ping 或 iwconfig 测试连接性,如果未连接,则启动扫描。
就像是:
#!/bin/bash
if ! ping -c 1 -W 1 your_router_ip &> /dev/null
then
iwlist wlan0 scan
fi
但请记住,此脚本必须使用 sudo 或 root 权限执行。它仅发送 1 个 ping,超时时间为 1 秒。
答案3
我认为问题是由于路由器的连接问题导致连接丢失。当路由器本身出现问题时,重新启动网络管理器无济于事。相反,您可以创建一个脚本,让运行该软件的进程暂停,方法是使用停止信号当连接丢失时,再次触发进程继续使用信号控制当网络可用时。并将脚本添加到您的 cron 作业中,安排其每分钟运行一次。
供你参考 :http://hints.macworld.com/article.php?story=20030915193440334
希望这可以帮助。