2016-06-14 119 views
1

我正在写一个小python脚本,以便用它来检查haproxy。该脚本所做的是在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)。是它可能以某种方式评价如果答案已收到?

+0

您的意思是,如果您此刻没有得到回复,或者您希望它完全不阻止? – noteness

+0

你可以设置一个“超时”。这是等待回复的最长时间 – 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)