简而言之:进程第一次尝试使用连接时,如果由于没有可用连接而失败,则该单个进程将永远无法重新获得使用网络的能力。我必须终止并重新启动它。
我有一个 ruby 脚本,它尝试解析“google.com”三次。如果我禁用网络(通过 NetworkManager)或关闭我的物理 WLAN,启动脚本,让它失败一次,然后重新启用网络,其他两次解析也会失败,即使系统的其余部分都有网络。
类似的 Python 脚本以及浏览器 lynx 也表现出相同的结果。但 Firefox 不是!这些行为都在运行最新 Manjaro x64 XFCE 的虚拟机和物理机上进行了测试。在最新的 Ubuntu x64 上,相同的测试运行良好。
为什么会发生这种情况?这是错误、功能还是怪癖?
编辑:
在 Manjaro 上,的内容/etc/resolv.conf
由 resolvconf 重新生成。
- 网络启用:
search lan; nameserver 192.168.1.1
- 网络已禁用:空文件
Ruby/Python/Lynx 只能读取resolv.conf
一次。因此,在第一次请求时,它会找到空文件,并且再也无法解析任何名称。
在 Ubuntu 上/etc/resolv.conf
:
- 网络启用:
nameserver 127.0.1.1; search lan
- 网络已禁用:
nameserver 127.0.1.1
因此,当 Ruby/Python/Lynx 在禁用的网络上读取它时,当连接恢复时,它们仍然会有一个名称服务器可以联系。Manjaro 设置的问题是,如果没有连接,就没有名称服务器。Ubuntu 为 127.0.1.1 运行 dnsmasq,而 Manjaro 没有。
答案1
在我看来,有两种解决方案。
- 编辑 resolvconf.conf:
name_servers=192.168.1.1
或您最常用的名称服务器。问题:并非每个名称服务器都像192.168.1.1
我的一样。如果您连接到不同的网络,您的进程将保持中断,因为192.168.1.1
那里可能不存在名称服务器。 - 让 NetworkManager 设置并使用 dnsmasq通过添加几行
NetworkManager.conf
我尝试了这两种方法,都避免了问题。第二种方法似乎更干净,也更容易设置,但不够轻便。