2016-06-14 33 views
1

私はhaproxyをチェックするために小さなpythonスクリプトを書いています。スクリプトが行うことは、haproxyソケットに接続して統計情報を「ポーリングする」ことです。ソケットからの応答がない場合、私が何をしたいどのようなPython socket.recv評価

#!/usr/bin/env python 

import socket 
import sys 

my_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) 

try: 
    my_socket.connect("/var/run/haproxy/haproxy.sock") 
except socket.error: 
    print "cant connect to socket" 
    sys.exit(1) 

my_socket.send("show stat\n") 
response = my_socket.recv(1024) 
print response 

は終了コードでスクリプトを終了するには、haproxyは、出力の統計をしない場合を意味し、(1)あれば何とか評価することが可能.Is答えは受け取られましたか?

+0

あなたが意味ですか? – noteness

+0

'timeout'を設定できます。応答を待つ最大の時間です。 – qvpham

+0

@ShamilKMuhammed私は応答が得られない場合を意味します。スクリプトが正常に "show stat"コマンドを送信したと仮定しても、もう一方の端はリピートしません。 – giomanda

答えて

0

デフォルトでは、ソケットはブロックモードになり、データが受信されるか、接続が閉じられるまで、recv()はブロックされます。

プロキシが一定の時間内に応答すると思われる場合は、クライアントソケットでタイムアウトを設定できます。タイムアウトは、ソケット操作が完了するまで待機する秒数です。例外を完了していない操作が発生した場合:

一つの方法だと、それはおそらく最も簡単な方法です
my_socket.settimeout(5.0) # 5 seconds. Set this after connecting. 
try: 
    response = my_socket.recv(1024) 
    print response 
except socket.timeout as exc: 
    print 'timed out waiting for response from proxy' 
    my_socket.close() 
    sys.exit(1) 

select()モジュールを見ることもできます。このモジュールは、クライアントがソケットが読み込み可能になるのを待つ関数です。読み取るべきデータがあるか、ソケットが閉じられていることを示します。それは本当にあなたが望む行動に依存します。 select()使用例:あなたは、現時点で回答を得ることはありませんかあなたはそれがすべてでブロックしないようにしたいならば

import select 

r, _, _ = select.select([my_socket], [], [], 5.0) 
if r: 
    response = my_socket.recv(1024) 
    print response 
else: 
    print 'Nothing received from proxy in 5 seconds' 
    my_socket.close() 
    sys.exit(1)