断开连接后如何保持wifi连接?

Blu*_*nie 9 cron wireless networking

我有一台运行需要互联网的软件的 Ubuntu 机器。但是,有时 wifi 会失败(例如路由器重新启动)并且不会再次找到网络,直到我手动为网络管理器重新启动服务或关闭并打开 wifi 以找到它。

是否有可能运行 cron 作业或 supervisord 作业来监视连接,如果找不到网络以重新启动网络管理器服务并连接到该特定 SSID?

Sad*_*adi 7

我认为这可能是由于一个新的网络管理器错误,因为我最近也开始遇到这个问题 - 我认为在升级到 Ubuntu 15.04 之后。

似乎我已经设法暂时解决了这个问题,作为这两个文件的解决方法:

  1. 我有一个脚本文件来观看 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
Run Code Online (Sandbox Code Playgroud)

  1. 我还有一个 .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
Run Code Online (Sandbox Code Playgroud)

注意:您需要在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
Run Code Online (Sandbox Code Playgroud)


小智 1

我不知道为什么,但正如你提到的,有时当 wifi 失败时,网络管理器不会再次找到网络。

我认为问题在于网络管理器在 wifi 连接失败后不会刷新 wifi 列表(并且网络管理器似乎隐藏了有问题的网络)。网络管理器没有重新扫描菜单选项,并且在网络管理器菜单上禁用和启用无线复选框不会强制执行新的 wifi 扫描(就像重新启动服务一样)。

当网络管理器失去我的无线连接并且它不再找到我的 wifi(并且我知道 wifi 可用)时,我执行命令:

sudo iwlist wlan0 scan
Run Code Online (Sandbox Code Playgroud)

它在 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
Run Code Online (Sandbox Code Playgroud)

但请记住,此脚本必须使用 root 权限进行 sudo 或执行。它仅发送 1 个 ping,超时时间为 1 秒。


Vir*_*els 0

我认为问题就像由于路由器的连接问题而导致连接丢失。当路由器本身出现问题时,重新启动网络管理器也无济于事。相反,您可以创建一个脚本,在连接丢失时使用SIGSTOP暂停运行软件的进程,并在网络可用时再次触发进程继续使用SIGCONT 。并将脚本添加到您的 cron 作业中,安排它每分钟运行一次。

供您参考:http://hints.macworld.com/article.php? story=20030915193440334

希望这可以帮助。