문제

웹 서비스는 USR1 신호를 수신 할 때 일부 데이터를 노출하도록 구성됩니다. 신호는 원격 클라이언트 (예 : NC MyServer 50666)로부터 요청을 수신 할 때 XINETD 서버에 의해 전송됩니다. 웹 서버가 USR1 신호를 수신하면 전용 FIFO 파이프를 열고 파이프에 데이터를 씁니다. 파이프. 그 동안 Xinetd 서버는 파이프를 읽고 원격 클라이언트에게 공급합니다.

대부분의 경우, 그들은 멋지게 작동하지만 때로는 어떤 이유로 든 고객은 DUP 레코드를 받게됩니다. 로그에서 파이프가 제대로 닫히지 않고 캐시가 남은 것처럼 보이므로 다음에 서비스를 제공하면 이전과 전류가 클라이언트로 전송됩니다. 문제는 운이 좋지 않게 재생산하려고 할 때 끊임없이 일어나지 않는다는 것입니다. 한 번은 번식 할 수 없었습니다.

다음은 과정을 보여주는 간단한 스 니펫입니다.

웹 서버 : (Webserver.py)

def SendStream(data, pipe):
  try:
    for i in data:
      pipe.write(i + '\n') 
      pipe.flush()
  finally:
      pipe.close()

def Serve():
  threading.Thread(target=SendStream, args=(data, pipe)).start()

xinetd.d 서버 : (spitter.py)

def Serve():
  if not os.path.exists(PIPE_FILE):
    os.mkfifo(PIPE_FILE)
  os.kill(server_pid, signal.SIGUSR1)
  for i in open(PIPE_FILE):
    print i,

그렇다면 DUP의 원인은 정확히 어떻게 되었습니까? 그것을 트리거하는 방법? 현재 수정 사항은 파이프 파일을 풀고 남은 음식을 피하기 위해 매번 재현하지만 적절한 솔루션인지 모르겠습니다.

도움이 되었습니까?

해결책

Splitter.py의 두 장을 동시에 실행하면 문제가 발생하고 거의 모든 일이 합법적입니다. webserver.py에 프로세스 ID 값을 추가 해보십시오.

pipe.write (str (os.getpid ()) + i + ' n')

그것은 밝을 수 있습니다.

다른 팁

여기서 디버그하기에 충분하지 않습니다. 서버가 신호를 처리하거나 파이프를 열는 방법을 보여주지 않습니다.

가능하다면 신호를 사용하지 않는 것이 좋습니다. 그들은 C에서 충분히 털이 있으며, Python 자신의 특성이 상단에 추가 된 적이 없습니다.

따라서 실제 문제는 여러 클라이언트가 있다는 것입니다. 서버는 처음에는 고객과 합의되지 않은 다른 미지의 고객으로부터 쿼리/학대를 당했으며 현재 설계에 따라 중단 될 것입니다. 문제를 해결하기 위해 수정이 배포되었습니다. 앤디의 의심이 옳습니다. 감사합니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top