2017-01-06 6 views
2

현재 서브 프로세스 (System.Diagnostics.Process)를 실행중인 서비스가 있습니다. 각 하위 프로세스는 몇 시간 동안 실행될 수 있으며 미리 정의 된 특정 상태 ("시작", "작업", "정리"등)로되어있을 수 있습니다. 완전히 미리 정의되어 있으며 각 상태에 첨부 된 사용자 정의 데이터는보고되지 않아야합니다. 각 프로세스는 개별 Windows 서비스가 될 수 없습니다 (Windows 서비스 상태보다 가능한 상태가 더 많음). 어떻게 든이 상태를 부모 서비스에보고해야합니다. 모든 프로세스가 동일한 Windows 시스템에서 실행 중입니다.상위 서비스에 서브 프로세스 상태보고

다른 프로세스 (서비스가 시작한 프로세스가 아닌)에서 서브 프로세스 상태를 쿼리하고 해당 서브 프로세스의 각 서브 프로세스 상태에 대한 상위 서비스를 업데이트 할 수 있어야합니다. 각 프로세스는 고유 한 ID를 가지므로 다른 프로세스는 프로세스 자체를 관리하지 않고도 상태를 쉽게 읽을 수 있습니다. 모든 프로세스는 각 하위 프로세스가 자신을 식별 할 수있는 고유 한 ID를 할당받는 구성 파일을 공유합니다. 나는과 같이 그 일을 생각했습니다

  • 서비스 (RedirectStandardOutput = true), 출력의 각 줄을 읽고
  • 모든 하위 프로세스를 쓰기 (STATECHANGE:state) "특별한"라인을 잡기에 리디렉션 하위 프로세스 '표준 출력 '상태가 변경 될 때마다 사전 정의 된 위치의 파일에 상태를 표시하고 서비스 종료시 해당 파일을 삭제하십시오.

나는 오래 전에 해결 된 문제에 대한 해결책을 찾고자하는 것 같아서 그 해결책을 찾지 못했습니다. 그러한 상태보고를 수행하는 "좋은"방법이 있습니까?

답변

2

일반적으로 프로세스 간 통신 또는 IPC의 영역을 탐구하고 있습니다.

이 질문에 Microsoft Windows와 관련된 태그가 지정되어 있지는 않지만 C# 및 .NET 태그가 붙어 있으므로 아마도 Windows 환경에서 실행 중일 것입니다. 내 대답은 당신이 MS Windows에서이 시스템을 실행하고 있다고 가정합니다.

이와 같은 문제에 대한 일반적인 해결책은 데이터베이스의 저장소 상태입니다. 각 서비스/프로세스는 데이터베이스에 독립적으로 쓸 수 있으며 해당 정보에 관심이있는 프로세스가 쿼리 할 수 ​​있습니다. 그러나 이것은 진정한 양방향 의사 소통이 아닙니다.

부모 프로세스가 자식 프로세스와 통신하는 방법은 여러 가지가있을 수 있지만 자식 프로세스가 스레드에서 일종의 메시지 펌프를 실행하고 다른 스레드에서 데이터 처리를 수행하는 것이 가장 쉽습니다 . 메시지 펌프는 메시지를 수신하고 응답하며, 데이터 처리 스레드는 그 일을 처리합니다.

  • 윈도우 통신 프레임 워크 (WCF)
  • 명명 된 파이프
  • 을이 방식을 사용

    , 메시지를 포함한 다른 여러 가지 방법으로 교환 할 수있다.NET 원격

  • MS 메시지 대기열 (MSMQ)
  • 윈도우 클립 보드
  • 동적 데이터 교환 (DDE)
  • 구성 요소 개체 모델 (COM)
  • 메모리 매핑 된 파일
  • 원격 프로 시저 호출 (RPC)
  • 소켓이 모든 프로세스 이후

는 동일한 시스템에 파이프합니다을 실행 간단하고 쉬운 선택. System.IO.Pipes 네임 스페이스 확인

WCF를 사용하면 다른 IPC 메커니즘뿐만 아니라 파이프 위에 구현할 수있는 풍부한 메시징 인터페이스를 만들 수 있습니다.

".NET", "프로세스 간 통신", "프로세스 간 통신"등과 같은 용어를 사용하여 .NET에서 프로세스 간 통신에 대해 설명하는 좋은 리소스가 많이 있습니다. IPC "및"로컬 시스템 "(로컬 시스템의 프로세스간에 IPC가 필요하기 때문에).

+0

예,이 모든 것이 Windows에서 실행 중이며이를 명확히하기 위해 제 질문을 수정했습니다. 이게 내가 필요한 것 같아. 고마워! –