2013-03-27 1 views
2

가능한 모든 게임 서버 (명령 행이 있음)를 제어 (시작, 중지, 재시작 등 - gnu 화면으로) 할 수있는 작은 소프트웨어를 개발 중이며 완전한 독립형 웹 서버가 포함되어 있습니다 webinterface (당신이 거기에 붙어있는 것처럼 gnu 화면에 접근 할 수 있습니다) 리눅스에서.gnu 화면 출력을 실행중인 파이썬 프로세스에 "파이프"하는 방법은 무엇입니까?

거의 모든 것이 작동하며 일부 코드 정리가 필요합니다.

파이썬으로 작성된 독립형 웹 서버는 cherrypy를 프레임 워크로 사용합니다.

문제가되면, webinterface에 GNU 화면 출력이 활성화 된 경우 (확인, 실행중인에 따라 달라집니다) 높은 I/O를 일으킬 수있는 로그 파일을 통해 이루어집니다.

파이프하는 방법 (이 빨라야한다) 독립형 웹 서버에 직접 출력 있는가? 어쩌면 소켓을 가진 무언가 일지 모르지만, 나는 그들을 어떻게 다룰 지 모릅니다.

+1

"gnu screen"이라고 할 때 http://www.gnu.org/software/screen/을 의미합니까? –

+0

예, 정확합니다. – carrot

+0

'화면'을 사용할 때 어떻게 "로그 파일"을 만드나요? –

답변

2

mkfifo mypipe.log으로 FIFO를 생성하고 로그를 작성하면 파이썬에서 열어 읽을 수 있어야합니다. Python and FIFOs이 도움이 될 수 있습니다. 로그의 하드 카피를 원하면 tee을 통해 출력을 파이프 할 수 있습니다.

+0

감사합니다! 나는 이것을 시험해 봐야하지만 좋은 방법 인 것 같다. :) – carrot

+1

항상 파이프를 읽어야한다! 그렇게하지 않으면 파이프의 버퍼가 가득 차면 프로세스가 차단됩니다 (버퍼는 약 4KB입니다). –

1

파이프에 쓰기 작업을하지만 당신은 충분히 빨리 파이프에서 데이터를 읽기 없을 때 명령 (파이프를 쓰는 사람이) 차단하기 때문에 그것은 위험합니다.

더 나은 해결책은 소켓에서 stdin을 게시하는 로컬 "로그 서버"를 만드는 것입니다. 이제 명령의 출력을 stdin에서 읽은 로그 서버로 파이프 할 수 있으며 입력 사본을 소켓에 연결된 모든 사람에게 보냅니다.

아무도 연결되어 있지 않으면 출력이 무시됩니다. 이러한 "로그 서버"를 작성

가 사소한 (파이썬에서 1 시간에 대해, 나는 추측에는 요).

추가적인 장점은 (지난 100 선을 말한다) 메모리에 로그 파일의 일부를 유지할 수 있다는 것입니다. 명령이 충돌하면 로그 서버에서 마지막 출력을 얻을 수 있습니다.

이렇게하려면 stdin이 EOF를 반환 할 때 로그 서버를 종료하면 안됩니다. 단점은 오래된 로그 서버를 직접 정리해야한다는 것입니다. 소켓을 사용하면 웹 응용 프로그램에서 "kill"명령을 보낼 수 있습니다.

0

syslog를 사용하거나 더 잘 구성하여 모든 로그를 데이터베이스로 보낼 수 있습니다!

관련 문제