2016-06-14 6 views
1

haproxy를 검사하기 위해 작은 파이썬 스크립트를 작성하고 있습니다. 스크립트가 수행하는 작업은 haproxy 소켓에 연결하고 통계를 "폴링"하는 것입니다. 소켓에서 응답이없는 경우Python socket.recv evaluation

#!/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

'timeout'을 설정할 수 있습니다. 응답을 기다리는 최대 시간입니다. – qvpham

+0

@ShamilKMuhammed 응답을받지 못하면 의미합니다. 스크립트가 "show stat"명령을 성공적으로 전송했다고 가정하지만 다른 쪽은 다시 연결되지 않습니다. – giomanda

답변

0

기본적으로 소켓은 블로킹 모드이며 데이터가 수신되거나 연결이 닫힐 때까지 recv()이 차단됩니다.

프록시가 일정 시간 내에 응답한다고 가정 할 수 있으면 클라이언트 소켓에서 시간 초과를 설정할 수 있습니다. timeout은 소켓 작업이 완료되기를 기다리는 초 수입니다. 작업이 완료되지 않은 경우 예외가 발생합니다.

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) 
관련 문제