2012-02-13 88 views
1

我們的應用程序(RHEL 5/C++)使用由gethostid返回的hostid用於記錄目的。由於某些原因,本地網絡環境的主DNS服務器已脫機。這導致在gethostid大量問題:函數調用掛起超過60s,這導致我們的應用程序內部超時。在命令行上撥打hostid也幾分鐘後沒有返回。一旦DNS服務器重新啓動,應用程序和命令行工具中的超時/問題都會消失。如何防止gethostid在Linux上執行DNS查詢

我的問題是:如何防止gethostid進行DNS查找?有一些邊界條件的答案:

  • 該文件/etc/hostid一定不存在。
  • 不允許撥打sethostid
  • 更改/etc/hosts是不可能的。

我很驚訝這發生在所有。據我瞭解gethostid它的工作原理是這樣的:

  1. 返回最後sethostid,如果它已經手動設置的值。
  2. 如果文件存在,則返回hostid表單/ etc/hostid。
  3. 返回主機的主IP(如果設置)。
  4. 其他情況不合格。

我看不到需要DNS查詢。

要進行驗證,即gethostid實際工作DNS服務器上dependend,試試這個:

  • 以root的身份創建/更改/etc/reslov.conf所以它僅包含無效nameserver條目。在命令行上調用hostid

在我的debian/squeeze安裝中,這導致hostid 00000000沒有任何掛起。我認爲hostid的RedHat版本是不同/較舊的,並且結果是掛起的。

+0

我忘了一些小細節:'/ etc/nsswitch.conf'包含'hosts:files dns'。系統主IP的主機名不在'/ etc/hosts'中。這是通過設計和客戶要求。 – briconaut 2012-02-13 12:54:56

+0

是從'/ etc/nsswitch.conf'中刪除'dns'是否可接受的解決方案? – nickgrim 2012-02-13 14:45:09

+0

我不這麼認爲。這會阻止所有的DNS查詢,對吧?肯定是不希望的副作用。 – briconaut 2012-02-13 16:05:29

回答

0

我認爲從gethostid防止DNS查找不是真的可能不破壞系統或違反其中一個邊界條件。在gnu.org我發現在sethostid功能此評論:

建立了系統的主IP地址的正確方法是配置IP地址解析爲與系統的主機名的IP地址相關聯的返回通過gethostname。例如,在/ etc/hosts中放入一個系統記錄。

由此我得出結論,即gethostid決定了IP這樣的:

  • gethostname獲取主機名。
  • 通過gethostbyname(或類似方法)確定IP。

在此條件下,在/etc/hosts和​​主機名不相關聯的IP地址允許DNS查找,DNS查詢將gethostid進行。