簡而言之:進程第一次嘗試使用連線時,如果由於沒有可用連線而失敗,則該進程將永遠無法重新獲得使用網路的能力。我必須殺死並重新啟動它。
我有一個 ruby 腳本,嘗試解析“google.com”三次。如果我停用網路(透過 NetworkManager)或關閉實體 WLAN,啟動腳本,讓它失敗一次,然後重新啟用網絡,其他兩個解析也將失敗,即使系統的其餘部分具有網路。
類似的 Python 腳本以及瀏覽器 lynx 都顯示相同的結果。但不是火狐!這些行為均在運行最新 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
我嘗試了兩種方法,都避免了症狀。第二個看起來更乾淨,更容易設置,但不那麼輕量級。