윈도우에서 "항.상. 돌아가는" - 알아서 재기동하는 프로그램의 정석적인 구현방법?

조회수 1497회

최근 간단한 윈도 서버 프로그램을 만들었습니다.(server.exe라 하겠습니다) 이 프로그램은 사내 네트워크를 통해서 클라이언트에게 명령이 오면 서버의 복잡하고 무거운 프로그램(heavy.exe)을 실행하는, 그리고 이미 헤비가 실행중이면 추가 실행을 막는 간단한 구조로 되어 있습니다.

server.exe가 항상 살아있어서 클라이언트가 실행 되는지 쳐다보고 있어야 합니다. 즉, 컴퓨터 부팅 될 때 알아서 기동 하고, 오류로 죽으면 재기동 해야 합니다.

이걸 감시하는 프로그램을 만들어서 해결할까 생각해 보았는데, 그 감시하는 프로그램이 죽으면 말짱 꽝이더라고요. 감시하는 프로그램을 감시하는 프로그램을 감시하는 프로그램....이 되어 버리니까. 윗동네 마냥.

구글링하니까 저의 형편없는 영작능력 탓인지 항상 관리자권한으로 실행하게 하는 법만 검색되고 진짜 필요한 정보를 못찾겠습니다. 일단

  1. 작업 스케쥴러를 이용해서 어떻게든 해 본다.
  2. http://karyurid.tistory.com/97 의 방식인데, 죽으면 알람을 이용한다? (근데 이것도 예쁘게 죽어야 적용되지, 버그로 죽으면 못할거 같은 우려가 있음)

정도를 찾아 보았습니다.

정석적인 방법이란게 있을까요?

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    간단한 방법으로는 서로를 감시하는 서비스 프로그램 a, b를 만들고 a가 죽으면 b가 살리고 b가 죽으면 a가 살리면 됩니다.

    실제로 이런구조로 종종 개발 합니다.

    제대로 하려면 프로세스를 강제로 kill 못하게 커널영역에 드라이버를 설치해서 감시하는 것입니다. 백신이나 보안프로그램이 이런 구조로 되어 있습니다. 파일 삭제등을못하게 파일시스템 필터드라이버 및 프로세스 감시하는 드라이버를 설치하여 관리합니다.

    • a,b가 서로를 감시하는 형태도 생각을 해 보았는데, 둘이 동시에 죽었을 때 대처가 안되겠더라고요; 현업에서는 그 정도로 충분한가요? 그렇다면 저도 이 정도로만 해도 충분합니다 라고 이야기 할 수 있어서 좋기는 한데; 게다가 쉽고 간단한 방법이라 광자 2017.8.21 11:59
    • 추가로, 지금 살아있는 프로세스는 어떻게 확인하세요? 저는 os내장프로그램인 "wmic process get description" 를 실행시키고 이 결과값을 리스트에 얹어서 제가 원하는 프로세스가 리스트에 있는지 검사합니다. 이것도 정석적인 방법이란게 있을까요? 광자 2017.8.21 12:03
    • CreateToolhelp32Snapshot, Process32First, Process32Next 함수을 이용해서 프로세스 리스트를 얻어 확인합니다. 또한 프로세스 두개가 동시에 죽는 경우가 있을까요? 강제로 kill하지 않는이상......강제로 kill하는 것을 막으려면 커널영역에서 해야 합니다. 정영훈 2017.8.21 12:16
    • 알겠습니다. 감사합니다. 광자 2017.8.21 12:18
    • 대충 한달 쯤 경과했는데, 이 방식으로 띄운 서버 프로그램이 여전히 잘 살아 있습니다. 생각보다 괜찮은 방법인거 같습니다. 광자 2017.9.27 16:00

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)