我们的应用程序(rhel 5/c++)使用gethostid
返回的hostid进行日志记录。由于某种原因,本地网络环境的主DNS服务器脱机。这导致了gethostid
中的大量问题:函数调用挂起超过60秒,这导致我们的应用程序出现内部超时。几分钟后,在命令行上对hostid
的调用也没有返回。一旦dns服务器再次启动,应用程序和hostid
命令行工具中的超时/问题就消失了。
我的问题是:如何防止gethostid
进行dns查找?答案有一些边界条件:
文件/etc/hostid
不能存在。
不允许调用sethostid
。
无法更改/etc/hosts
。
我很惊讶这种事竟然发生了。据我所知,它的工作原理如下:
如果已手动设置,则返回上一个gethostid
的值。
如果文件存在,则返回HOTIDD窗体/ETC/HODITD。
如果已设置,则返回主机的主IP。
其他情况不合格。
我不认为需要DNS查询。
要验证sethostid
是否实际依赖于工作的dns服务器,请尝试以下操作:
作为根用户创建/更改/etc/reslov.conf,因此它只包含无效的gethostid
条目。
在命令行上调用nameserver
。
在我的Debian/Squeeze安装中,这将导致主机IDhostid
而没有任何挂起。我假设redhat版本的00000000
是不同的/旧的,结果会挂起。
最佳答案
我认为在不破坏系统或不违反某个边界条件的情况下,防止dns查找gethostid
是不可能的。在gnu.org上,我发现对sethostid
函数的以下注释:
建立系统主IP地址的正确方法是将IP地址解析程序配置为将该IP地址与gethostname返回的系统主机名相关联。例如,将系统的记录放在/etc/hosts中。
由此我得出结论,gethostid
决定ip如下:
从gethostname
获取主机名。
通过gethostbyname
(或类似方法)确定IP。
在主机名不与/etc/hosts
中的IP地址关联且/etc/nsswitch.conf
允许DNS查找的条件下,将由gethostid
进行DNS查找。
关于linux - 如何防止gethostid在Linux上进行DNS查找,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9258228/