2009-11-19 11 views
18

Windows 서비스의 복구를 실패 후 1 분 지연으로 다시 구성하도록 구성합니다. 하지만 실제로 서비스를 다시 시작하지 못했습니다 (심지어 가장 뻔뻔한 오류가 있음에도 불구하고). 찾을 수없는 소스 (MyApp.exe의)에서 이벤트 ID (1)에 대한Windows 서비스 복구 서비스를 다시 시작하지 않음

설명 :

나는 이벤트 표시기에서 메시지를받을 수 있나요. 로컬 컴퓨터에 원격 컴퓨터의 메시지를 표시하는 데 필요한 레지스트리 정보 또는 메시지 DLL 파일이 없을 수 있습니다./AUXSOURCE = 플래그를 사용하여이 설명을 검색 할 수 있습니다. 자세한 내용은 도움말 및 지원을 참조하십시오. 다음 정보는 이벤트의 일부입니다 : 'MyApp.exe'모듈의 00429874 주소에서 액세스 위반. 주소 00456704를 작성하십시오.

내가해야 할 일이 있습니까? 이 기능을 사용하도록 설정해야하는 코드 (Delphi를 사용)에 뭔가 있습니까?

+0

이 질문이 도움이 될 수 있습니다. http://stackoverflow.com/questions/220382/how-can-a-windows-service-programmatically-restart-itself?rq=1 –

답변

19

서비스 복구는 서비스가 충돌하는 경우를 처리하기위한 것입니다. 따라서 taskmgr로 이동하여 서비스 프로세스에서 "프로세스 끝내기"를 마우스 오른쪽 버튼으로 클릭하면 복구 논리가 시작됩니다. 서비스 복구 로직은 서비스가 정상적으로 종료되면 실행됩니다 (오류 발생시 종료 되더라도).

또한 eventvwr 메시지는 응용 프로그램이 이벤트 ID 1을 지정하는 ReportEvent API를 호출했음을 나타냅니다. 그러나 이벤트 ID를 의미있는 텍스트 문자열로 변환 할 수 없도록 이벤트 뷰어에 이벤트 메시지를 등록하지 않았습니다.

+1

감사. 이것은 상황을 밝혀줍니다. taskmgr에서 "프로세스 끝내기"를 수행하면 이벤트 뷰어에서 다음을 생성합니다. 다음과 같은 수정 작업이 60000 밀리 초 내에 수행됩니다. 서비스를 다시 시작합니다. 이제 제 코드와 관련한 제 문제는 복구 로직이 시작될 수 있도록 "Un-Gracefully"을 종료하는 것입니다. –

+1

ExitProcess를 호출하면 충분하다고 생각하면됩니다. –

8

서비스 복구는 (종료 (-1))와 같은 예기치 않은 종료에만 작동합니다. 일반적인 방법으로 서비스를 중지하는 데 사용되는 모든 방법으로 복구 할 수 없습니다. 서비스를 중지하고 복구가 계속되기를 원하는 경우 exit (-1)으로 전화하면 "예기치 않은 오류로 서비스가 중지되었습니다"라는 오류 메시지가 표시되고 복구 설정대로 서비스가 다시 시작됩니다.

+0

+1 답변을 보내 주셔서 감사합니다. 많은 도움이 – Jehof

+2

정확한 방법을 찾는 분들은 Environment.Exit (-1); –

0

작업 관리자에서 서비스를 "종료"하는 경우 복구 논리를 잊어 버렸습니다. 백그라운드 작업 관리자에서 '서비스 중지'로 프로세스를 '종료'합니다. yuo가 짐작할 수있는 것처럼 - 이것은 서비스 실패가 아닙니다. 이로 인해 Visual Studio에서 실제로 강제 종료되었습니다. 작업 관리자에서 서비스 프로세스를 마우스 오른쪽 버튼으로 클릭하십시오. 디버그를 선택하십시오. Visual Studio에서 디버그 -> 모두 종료를 선택하십시오. 이제 시뮬레이션 된 서비스가 실패했습니다. 이 경우 복구 로직이 정상적으로 작동합니다.

0

서비스 제어 관리자는 SCM에 의해 다시 시작되도록 설정 한 경우 서비스를 다시 시작하려고 시도합니다. 자세한 내용은 SERVICE_FAILURE_ACTIONS 구조에 대한 설명서에서 here입니다. 이 서비스 컨트롤러에 SERVICE_STOPPED의 상태를보고하지 않고 종료 될 때 서비스를 고려

에 실패했습니다.

는 미세 SERVICE_FAILURE_ACTIONS_FLAG 구조의 fFailureActionsOnNonCrashFailures 플래그를 설정하여 조정할 수 있습니다) here를 참조하십시오. 복구 탭에서 "오류로 인한 중지 동작 활성화"확인란을 선택하여 서비스 애플릿에서이 설정을 설정할 수 있습니다.이 멤버가 TRUE이고, 서비스 장애 조치를 구성한 경우, 서비스 프로세스 SERVICE_STOPPED의 상태를보고하지 않고 종료되거나 경우

은 장애 조치 대기중인 그것은 SERVICE_STOPPED 상태이지만 SERVICE_STATUS 구조 dwWin32ExitCode 부재 들어가면 ERROR_SUCCESS (0)이 아닙니다. 이 구성원이 FALSE이고 서비스가 실패 조치를 구성한 경우 SERVICE_STOPPED 상태를보고하지 않고 서비스가 종료 된 경우에만 실패 조치가 대기합니다.

그래서, 당신은 당신이 당신의 장애 조치 및 당신이 당신의 '치명적 오류'가 ExitProcess() 또는 exit()를 호출하기에 충분하고 0이 아닌를 반환 할 수있을 때 당신이를 구성하는 방법, 서비스를 구성 방식에 따라 값. 그러나 서비스가 SERVICE_STOPPED 상태에 도달했음을 SCM에 알리는 SCM을 처리하는 코드없이 서비스가 종료되는 것이 가장 안전합니다. 이렇게하면 실패한 작업이 항상 발생합니다 ...

관련 문제