2011-08-03 6 views
5

誰もが前にこのに実行します。DNS records..Iを更新した後socket.gethostbynameレスポンスのキャッシュをフラッシュする方法は?

私はsocket.gethostbyname( 'test.somedomainを行うしかし、ときに私は、167.69.143.234を得る「test.somedomain.com」の発掘を行いま​​す。 com ')私は167.69.6.234を得る。

私はソケットがまだキャッシュを使用していると推測しています...どうすればそれをクリアできますか?またはそれをフラッシュ?

私のコードは非常に簡単です:

LinuxのTermianl

dig test.somedomain.com 

のPython:

import socket 
socket.gethostbyname('test.somedomain.com') 

それがDNSで更新1であるとして、それは167.69.143.234アドレスを返すべきです。

答えて

6

Pythonのsocket.gethostbynameはオペレーティングシステムリゾルバを使用しており、キャッシュをクリアするためのAPIはありません。キャッシュ(オペレーティングシステムやオペレーティングシステムや標準ライブラリコンポーネントによって使用されるキャッシングDNSサーバでもよい)は、DNSシステムの基本要素であり、対処するための「正しい方法」は、レコードのTTL値有効期限が切れます(オペレーティングシステムはキャッシュから失効した値を削除する必要があります)。 DNSを更新するときには、古い値のTTLを以前に調整したほうがよいでしょう。

socket.gethostbynameの代わりにDNSPythonのようなPython DNS実装を使用することもできます。リゾルバキャッシュ(リゾルバが使用するNSのキャッシュではない)を完全に制御する必要があります。しかし、それはおそらくあなたの問題を解決することはありません(既存のコードで、私は推測します)。

2

DNSはデフォルトでLinuxにキャッシュされず、sssdまたはnscdなどのデーモンが必要です。デーモンを再起動するだけで、新しいアドレスを強制的に取得することができます。

Windowsユーザーのための注意:ipconfig /flushdnsでクリアできるデフォルトのキャッシュがあります。

また、/etc/hostsにハードコードされたエントリがある場合は、最初にチェックしてください。 またはnslookupのようなツールは、DNSサーバに直接照会し、NSSライブラリサブシステムをバイパスします。