2012-12-18 3 views
19

저는 tmux를 사용하여 Rails 3.2.6을 개발 모드로 실행 중입니다. tmux를 사용하여 레일스 서버의 출력 버퍼 (레일즈를 사용하여 실행)를 스크롤하면 서버가 멈추고 요청을 처리하지 않습니다. 스크롤 백 모드를 벗어날 때 서버가 다시 제대로 작동하기 시작합니다.tmux 출력 버퍼를 통해 검색 할 때 레일이 멈 춥니 다

출력 버퍼를보고있는 동안 요청을 처리하도록 서버를 설정하려면 어떻게해야합니까?

답변

21

서버가 요청 처리를 계속하는 동안 특정 로그 메시지 시퀀스를 일시 중지하고 검사하려면 로그 파일을 직접 보는 것이 가장 좋습니다. less -R log/development.log을 사용할 수 있습니다. TMUX 창 "복사 모드"(구획의 기록을 확인하는 데 사용되는 모드)에있는 동안

TMUX는 창의 청각 장애에서 실행중인 프로세스에서 출력을 읽지 않습니다. 프로세스가 tty에 출력을 계속 작성하면 OS의 tty 버퍼가 결국 채워집니다. 프로그램이 전체 버퍼를 사용하여 tty에 쓰면 버퍼가 오버 플로우되지 않도록 프로세스가 차단됩니다. 이것은 서버가 요청 처리를 일시적으로 중단하게하는 원인입니다.

타임 라인은 다음과 같습니다

  1. 당신은 오래된 출력을 볼 수 복사 모드로 들어갑니다.
    tmux tty에서 읽는 것을 중지합니다.
  2. Rails 서버는 진행중인 요청을 처리 할 때 tty에 계속 쓰기 작업을 수행합니다.
    OS는 이러한 쓰기를 제한된 크기의 tty 버퍼로 흡수합니다.
  3. 결국 OS tty 버퍼가 가득 차고 tty에 대한 추가 쓰기가 차단됩니다.
    레일즈 서버가 "정지"하는 곳입니다. OS가 (예를 들어) write (2)에서 로그 메시지를 표시하기 위해 호출하는 것을 기다리는 데 방해가됩니다.
  4. 복사 모드를 종료합니다.
    tmux은 tty에서 읽기를 다시 시작하고 버퍼링 된 출력을 소모하고 새로운 출력을 허용합니다.
+1

tmux를 사용하지 않고이 문제를 해결할 방법이 있습니까? – justingordon

+0

@justingordon : 창이 "복사 모드"에있는 동안 * tmux * 창에서 실행중인 프로그램이 충분히 쓴다면 결국 차단됩니다. 잡담적이고 장기 실행되는 프로세스의 결과를 검토 할 필요가 있다면 출력을 로그 파일로 보내고 * tmux *의 "복사 모드"를 사용하는 대신 'less'와 같은 것을 사용하는 것이 좋습니다. –

+0

iTerm2에서 txmux를 실행하는 것이이 문제를 해결하는 방법입니다. – justingordon