我正在编写一个小的python脚本,以便用它来检查haproxy。该脚本的作用是连接haproxy socket和" poll"对于统计数据。
#!/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 :(得分: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)