[완료]프로세스 상태 검사 기법

jeongheumjo의 이미지

윈도우 프로그램관련 질문입니다.
하지만 리눅스에서와 큰 차이는 없지 않을까 ... 혹은 공통되는 부분도 있을 것 같기도 합니다.

제가 프로세스풀을 만들었습니다. 워커 프로세스를 N 개 생성해서 임무를 부여하는 프로세스 매니저가 존재하고 그 프로세스 매니저는 작업을 가용한 프로세스에게 할당합니다.
지금 해결해야 하는 과제는 '중지된 프로세스의 재시작' 기능 입니다.
중지된 프로세스는 다시 두 가지로 나뉩니다.

- divide by zero 와같은 예외를 만나서 복구 불가능한 상태로 프로세스가 죽어버린 경우
- 죽지는 않았고 무한루프에 빠져 있거나 데드락 상태이거나 정상적인 처리중이지만 그 처리 시간이 비정상적으로 오래 걸리고 있는 중인 경우

두가지 상태 모두 해당 프로세스를 죽이고(TerminateProcess()) 재시작을 시켜야 합니다.

두번째 경우는 쉽게 해결했습니다. 간단히 타이머로 데드라인이 지난 경우 강제 종료 시켜도록 구현했습니다.
첫번째 경우가 문제입니다.

프로세스가 위와 같은 예외 혹은 에러로 죽은 것을 어떻게 감지해 내는가 하는 것이 문제입니다. 물론 그대로 내버려 두면 시간을 지나서 두번째 경우의 검사에서 시간 위반으로 확인은 되지만 문제는 시간위반이라도 첫번째 케이스와 같은 경우 처리를 달리해야 한다는 것입니다. 그래서 첫번째 케이스인지를 꼭 감지해 내야 하죠..

실시간 OS 에서는 혹은 서버와 같은 경우는 High Availibity 를 위해 이중화 기법 같은 것을 사용하는 걸로 알고 있습니다. 혹은 Heart Beating 을 하도록 해 놓고 Heart Beating 이 없으면 프로세스를 재시작 시키기도 하죠..
그런데 이렇게 Heart Beating을 하는 경우 문제는 Heart Beating을 작업을 수행하는 프로세스의 작업 스레드에서 해주어야 한다는 것입니다. Heart Beating 을 위한 전용의 쓰레드를 만드는 것은 유용할까 테스트해봤더니 작업쓰레드가 죽더라도 Heart Beating은 계속 되더라고요... 윈도우즈에서는 그런 경우 팝업창에서 프로그램의 비정상적인 상태롤 알려주는데 그 팝업창에서 확인 버튼을 누르면 그때서야 프로세스가 종료되면서 Heart Beating 쓰레드도 자동으로 정지가 되더군요.. 팝업창에서 확인 버튼을 누르지 않으면 Heart Beating 쓰레드가 계속 실행이 되니까 프로세스의 종료코드 검사나 WaitForSingleObject 를 통한 오브젝트의 상태검사도 의미가 없을 것 같아요.. 팝업창에서 확인버튼을 반드시 누르리라고 보고 코딩하면 안될 것 같아요..
작업 쓰레드에서 Heart Beating을 하도록 하면 되지 않느냐 하실 수도 있겠습니다만, 그게 만만한 일이 아닌 것 같습니다. 작업쓰레드의 로직을 대대적으로 손보아야만 구현 가능성이 생기고 그렇게 할 수 있으리라는 자신도 없습니다. Active Object 패턴 같은 것이 이런 경우 사용되는 것인지 싶고... 도무지 방법이 떠오르지 않습니다.

CreateToolhelp32Snapshot() 과 같은 함수에서는 유용한 정보를 얻을 수 없을 것 같았어요.. 프로세스 핸들같은 기본적인 정보들 뿐이더군요..

구현의 방법이 있을까요?
아니면 이런 것은 구현 불가능한 것일까요?

chadr의 이미지

간단하게 프로세스의 exit code를 확인하는 방법이 있습니다.
원리는 이렇습니다. 일반적으로 프로세스가 정상적으로 끝나면 main함수에서 0을 리턴하도록 되어있습니다.

그렇지 않는 경우에는 0을 리턴하지 않도록 프로그램을 짭니다.
예외로 인해 프로세스가 강제 종료 되었을 경우도 마찬가지입니다.

이럴 경우 운영체제는 0이 아닌 리턴값을 반환해줍니다. 아래는 그에 대한 샘플 코드입니다.

http://stackoverflow.com/questions/334879/how-do-i-get-the-application-exit-code-from-a-windows-command-line

http://www.hiteksoftware.com/mize/Knowledge/articles/049.htm

http://msdn.microsoft.com/en-us/library/ms683189(v=vs.85).aspx

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

jeongheumjo의 이미지

글을 쓰고 지금 바로 글을 [완료]로 처리하려고 했는데, 벌써 답변을 주셨네요 ^^; 감사합니다.
저는 프로세스의 종료코드를 확인하는것까지 나아가지 않더라도 프로세스가 종료했는지만 확인해도 되는 상황이 되었습니다. 종료했는지는 WaitForSingleObject() 로 확인 가능하구요.
이렇게 할 수 없었던 이유는 윈도우즈의 에러 보고 기능 때문이었더라구요.

'제어판 > 시스템 > 고급'

에 보면 '오류보고' 라는 버튼이 있습니다. 이곳에서 오류보고 기능을 끌 수 있었습니다. 그리고 이 기능을 꺼놓으면 에러나 예외 상황에서 프로세스가 종료되더라구요.
이렇게 프로세스가 종료만 된다면, 프로세스 매니저에서는 종료된 프로세스가 있는지만 검사해보면 종료된 것은 시나리오상에서 비정상이었으므로 예외나 에러가 난 것으로 판단할 수 있겠더라구요..

그래도 종료코드 확인 방법을 알려주셔서 감사드립니다.

winner의 이미지

int main(void)
{
    int* p = (int*) 0;
    *p = 1;
    return 0;
}

저는 말씀하신 것을 꺼보았지만 '응용 프로그램 오류' 는 여전히 납니다.

jeongheumjo의 이미지

- 오류보고 사용 안함 체크
- 치명적 오류가 발생하면 알림 언체크

그리고 컴파일된 실행파일을 비주얼스튜디오에서 F5 하는 방법이 아니라,
명령줄(윈도우+R 에서 찾기로 실행 파일 선택)에서 실행
혹은 컴맨드 창에서 실행프로그램 실행

의 방법으로 해보니 올려주신 코드로도 오류창 없이 프로세스가 바로 종료되었습니다.

아마 비주얼스튜디오에서 실행하셔서 그렇지 않았을까 추측해봅니다.
비주얼스튜디오에서 F5를 통해 실행하면 프로그램이 비주얼스튜디오 디버거의 차일드 프로세스로 실행되는게 아닌가 싶습니다.

그게 아니라면 윈도우즈 버전 차이가 있을 수도... 저는 XP Pro SP3 이거든요..

winner의 이미지

Windows 2008, 2008 R2, 7은 관련 설정이 아예 다른데에 있군요. 시험해보지는 않았구요.
회사에서 팀장님이 찾던 거라 한번 해봤습니다.

그런 program은 Server OS에서 동작시킬 가능성이 높을 것 같은데 한번 확인해보시기 바랍니다.
Server 2003과 XP 는 오류 보고 창이 좀 다르네요.

jeongheumjo의 이미지

맞습니다.
서버에서 실행할 프로그램입니다.
그 서버의 버전과 설정법도 확인해봐야 하겠네요..
관심 가져주셔서 감사합니다. ^^;

익명 사용자의 이미지

Structured Exception Handling 이라고

SetUnhandledExceptionFilter() 함수를 통해 예외를 잡을수 있는 기능이 있습니다.

MiniDump 등을 처리할때 사용하는 방법이지만

예외로 인한 종료감지처리에는 사용가능할듯 하네요.

이미 처리하셧다지만 혹시나 해서 남겨봅니다.

jeongheumjo의 이미지

알려주신 정보도 유용할 것 같습니다.
그런데 MSDN 마지막에보니까 이 함수는 DLL 에서는 사용 않는 것이 좋다고 컴맨트가 되어있군요..
이 내용도 포함해서 알고 있어야 할 것 같아요..

감사합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.