2011-03-12 3 views
0

저는 리눅스에서 C로 'wrapper'데몬을 작성하고있는 작은 취미 프로젝트를 가지고 있습니다. 즉, 목적은 시작하고, 모니터하고, 명령을 실행하는 것입니다. 다른 프로그램을 중지하십시오. 데몬은 또한 사용자가 로그인하여 실행중인 프로그램을 조작 할 수있는 웹 인터페이스를 제공합니다.wrapper-daemon 랩핑 된 프로그램 출력 처리

프로그램을 stdout에 쓸 때마다이 출력이 파이프로 리디렉션됩니다. 누군가 웹 인터페이스를 통해 프로그램에 접근 할 때마다 웹 인터페이스는 XMLHttpRequest()를 통해 데몬을 폴링하기 시작하고 데몬은 파이프에 무엇인가가 기록되어 있는지 확인한 다음 시각.

두 명의 (또는 그 이상) 사용자가 로그인하여 동일한 프로그램과 상호 작용할 때 주된 문제가 있습니다. 웹 인터페이스는 효과적으로 파이프를 작성하여 폴링하므로 여러 사용자가 로그인하여 동일한 프로그램을 모니터링 할 때마다 해당 프로그램의 출력이 사용자 중 한 명에게 임의로 전송됩니다. 이것은 분명히 나쁘다.

내가 지금 생각하고있는이 문제를 해결할 수있는 한 가지 해결책은 프로그램에서 생성 한 모든 출력에 타임 스탬프를 지정하고 데이터베이스와 같은 정보에이 정보를 저장하는 것입니다. 그런 다음 웹 인터페이스가 시간 소인으로 디먼을 폴링하면, 디먼은 이후 작성된 모든 출력을 수집하고이를 다시 송신합니다.

위의 해결 방법이 다중 사용자 문제를 해결할 것이라고 생각하지만이 문제에 대해 스택 오버플로 커뮤니티에 쿼리를 걸면 좋을 것이라고 생각했습니다. 이런 문제에 대한 더 나은 해결책이 있습니까? (나는 다소 이해할 수있는 방식으로 문제를 설명했다.)

답변

0

사용자가 다음 로그인시 주어진 프로그램의 모든 출력물을 제공 받기를 원하지 않는 한, 나는 정보를 데이터베이스에 저장하는 것이 필요하다고 생각하지 않습니다. 그것은 또한 비싼 편에 조금있을 것 같은데 들린다.

필요한 것은 사용자가 특정 출력 스트림에 가입하는 일종의 세션 구현 및 토큰 화 시스템입니다. 파이프 fd에서 select() 또는 poll()이 실행되면 해당 데이터가 해당 프로세스의 모든 가입자에게 기록되어야합니다.

가입 한 사용자에게 도달하지 못한 데이터가 다음에 로그인 할 때 표시되도록 저장되는 두 가지 방법을 모두 구현할 수 있습니다. 나는 귀하의 질문에 처음에는 혼란스러워했다

[process-token] 
TIMESTAMP.SEC.(...) = "string" 

그러나 그것을 읽은 후 : 그 필요성은 복잡한 또는 SQL 데이터베이스, 간단한 키 => 값 쌍 (예 : 그냥 INI 파일에 저장처럼 작동 할 수 없습니다 다시 우리는 거의 동일한 프로젝트를 수행하고 있음을 깨달았습니다. 광산은 Ajaxterm과 매우 유사한 것을 제공하는 Psuedo TTY에 간단한 직렬 클라이언트를 연결하고 있으며, 반 가상화 된 Xen 가상 시스템에 대한 콘솔 액세스를 용이하게합니다.

+0

사용자 별 스트림을 살펴 보겠습니다. 입력 해 주셔서 감사합니다. – jimka

0

추상 호스트의 fork 프로그램이 머리 부분을 대기열에 넣고 사용자가 각각 자신의 꼬리에서 소비하는 출력을 생성하는 일종의 대기열이 있습니다. "소비"부분은 약간 재미 있습니다. 관심있는 모든 사용자가 그것을 볼 때까지 "잊어 버리십시오". Tim Post는 사용자 스트림 당 간단한 대기열을 사용하고 모든 "가입 된"대기열에 대기열을 생성하는 것이 좋습니다. 다른 접근법은 생산자 당 대기열이며 사용자가 이미 본 거리를 표시하는 커서가 있습니다. 후자의 접근법은 아무 것도 복제하지 않는다는 점에서 간결하지만, 모든 사람이 후행하는 내용을 보았을 때 알아낼 수 있도록하므로 잊어 버릴 수 있습니다.

나는 후자의 접근 방식을 시도 할 것이고, 잊어 버리는 것만으로 생각한다. 즉, 항상 모든 출력을 영원히 저장하십시오. 이것은 잠재적으로 사용자들에게 상당히 매력적입니다. 결국, 터미널 에뮬레이터에는 크기가 큰 스크롤 백 버퍼가 없습니다. 더 많은 저장 공간이 있지만 요즘 저장 용량은 당황 스럽습니다.

DB를 사용하는 것이 좋지 않을 것이라고 생각합니다. 예를 들어 타임 스탬프를 생성 된 출력과 연관 시키거나 콘텐츠 내에서 검색을 수행하려고 할 수 있습니다. 사용자가 본 스트림에서 얼마나 멀리 ROWID에 의해 수행되는지를 추적하지만, 사용자는 "지난 1 시간 동안의 출력 표시"유형의 인터페이스를 이해할 수 있습니다. 각 큐를 테이블로 저장하고, 시간에 따라 인덱스 된 행은 DB에 대한 자연스러운 워크로드가 될 것이며 공간과 시간면에서 매우 효율적입니다. 그러나 기본 no-forget 큐는 사용자 위치가 오프셋으로 저장된 스트림 당 파일로 매우 간단하게 수행 될 수 있습니다.

사용자 별 스트림을 사용하는 Tim의 접근 방식은 제작자가 여러 구독자를 갖는 빈도에 따라 제작자의 컨텍스트에서 조금 더 효과가 있습니다. 제작자가 트위터와 같은 사람이라면 가능한 접근법이 아닙니다. 수백만 명의 사용자가보아야합니다.)하지만 사용자 별 스트림 방식은 가비지 수집을 방해하지 않으며 DB 및 타임 스탬프 아이디어도 포함 할 수 있습니다.

+0

아, 네, 트위터로드 근처에는 없습니다. 나는 팀의 접근법을 점검 할 것 같아. 귀하의 의견을 보내 주셔서 감사합니다. – jimka