如何防止gethostid在linux上进行DNS查找

时间:2012-02-13 09:33:45

标签: linux dns

我们的应用程序(RHEL 5 / c ++)使用gethostid返回的hostid进行日志记录。出于某种原因,本地网络环境的主DNS服务器脱机。这导致了gethostid中的大量问题:函数调用挂起超过60秒,这导致我们的应用程序内部超时。几分钟后,命令行上对hostid的调用也没有返回。一旦DNS服务器再次启动,应用程序和hostid命令行工具中的超时/问题就会消失。

我的问题是:如何阻止gethostid进行DNS查找?答案有一些边界条件:

  • 文件/etc/hostid不得存在。
  • 不允许拨打sethostid
  • 无法更改/etc/hosts

我很惊讶这种情况发生了。据我了解gethostid,它的工作原理如下:

  1. 如果已手动设置,则返回上一个sethostid的值。
  2. 如果文件存在,则返回hostid表单/ etc / hostid。
  3. 如果设置,则返回主机的主IP。
  4. 其他案件失败。
  5. 我不认为需要DNS查询。

    要验证gethostid实际上是否依赖于正在运行的DNS服务器,请尝试以下操作:

    • 以root身份创建/更改您的/etc/reslov.conf,使其仅包含无效的nameserver条目。
    • 在命令行上调用hostid

    在我的debian / squeeze安装中,这导致00000000的hostid没有任何挂起。我假设hostid的RedHat版本不同/更旧,结果会挂起。

1 个答案:

答案 0 :(得分:0)

我认为,如果不破坏系统或违反其中一个边界条件,就无法阻止gethostid的DNS查找。在gnu.org我发现了sethostid函数的评论:

  

建立系统主IP地址的正确方法是配置IP地址解析程序,将该IP地址与gethostname返回的系统主机名相关联。例如,将系统记录放在/ etc / hosts中。

由此我得出结论,gethostid确定了这样的IP:

  • gethostname获取主机名。
  • 通过gethostbyname(或类似方法)确定IP。

在条件下,主机名与/etc/hosts中的IP地址无关,而/etc/nsswitch.conf允许DNS查找,gethostid将进行DNS查找。