2016-11-15 5 views
1

발췌문 : 서비스가 시작되지 않으면서비스 시작에 실패하면 WiX 설치 프로그램을 어떻게 실패합니까? 내 WXS 파일에서

<ServiceInstall Id="ServiceInstall" Type="ownProcess" Vital="yes" 
    Name="service name" 
    DisplayName="service display name" 
    Description="service description" 
    Start="auto" Account="[SERVICEUSERNAME]" Password="[SERVICEPASSWORD]" 
    ErrorControl="normal" Interactive="no" /> 

<ServiceControl Id="StartService" 
    Start="install" Stop="uninstall" Remove="uninstall" 
    Name="service name" Wait="yes"> 
    <ServiceArgument>arguments for first run</ServiceArgument> 
</ServiceControl> 

, 설치는 그것이 정지 상태에 있음을 감지 할 수한다고 반면, 실패하기 전에 몇 분 동안 기다린 것과 포인트는 수동 개입없이 시작 상태에 도달 할 수 없습니다. 그러나 그것은 계속 기다리고 있습니다. 이 문제를 해결할 방법이 있습니까?

답변

0

서비스 제어는 메시지 기반 체계입니다. Windows Installer 및 서비스 제어 메커니즘은 서비스가 시작 메시지에서 응답 할 때까지 대기합니다. 코드가 합법적 인 작업을하고 있거나, 코드가 손상되었거나, 복구 코드가 있거나, 실패한 후에 다시 시작하도록 구성 되었기 때문에 (코드가 ChangeServiceConfig2 Win32 API 참조) "중지 상태에 있음을 감지"한다는 것이 무슨 뜻인지 확실하지 않습니다.

경우에 따라 서비스가 완전히 초기화 될 때까지 설치 프로그램을 명시 적으로 대기시키는 wait = yes가 있습니다. MSDN 문서에서 다음과 같이 말합니다 :

"이 필드를 null로 두거나 값을 1로 입력하면 설치 프로그램이 계속 진행되기 전에 서비스가 완료 될 때까지 최대 30 초 동안 대기합니다. 이 필드의 값 0은 설치를 계속하기 전에 서비스 제어 관리자 (SCM)가이 서비스가 보류 상태에 있음을보고 할 때까지만 기다리는 것을 의미합니다. "

대기 값을 변경하면 도움이 될 수 있습니다. 어쨌든 잘 코딩 된 서비스가 정상적으로 시작되는 정상적인 경우에는 이러한 문제가 발생하지 않습니다. 서비스가 중단된다는 사실은 드문 경우 (또는 있어야 함) 일뿐 아니라 일이 깨 졌을 때 실제로 깨져서 종종 그 이유 때문에 예측할 수 없습니다.

+0

제가 알기에 서비스는 7 가지 상태 중 하나 일 수 있습니다 : https://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontrollerstatus(v=vs.110).aspx에서, ContinuePending, Paused, PausePending, Running, StartPending, Stopped, StopPending 중 하나입니다. 서비스가 StartPending에 도달 한 후 Stopped로 이동하면 서비스가 시작되지 못하고 기다리는 대신 설치가 실패 할 것으로 예상됩니다. 서비스가 실패한 후에 다시 시작하도록 구성되지 않았습니다. (아마도 그래야합니다 ...) –

+0

- WiX에서 값 1을 허용하지 않으면 오류가 발생합니다. "오류 CNDL0015 : ServiceControl/@ Wait 속성의 값 , '1'은 합법적 인 예/아니오 값이 아니며 유효한 값은 '아니요'와 '예'뿐입니다. " ServiceControl 설치 관리자 테이블에서 '예'가 1로 변환되고 '아니오'가 0으로 변환된다고 가정합니다. –

+0

내가 말했듯이 MSDN 문서의 원본을 언급하고 대기 값을 지정하는 WiX 구문을 언급하지는 않습니다. 설명하는 서비스 상태는 자동으로 감지되지 않고 QueryServiceStatus와 같은 API에 의해보고되므로 서비스는 해당 값을 반환하도록 코딩되어야하며 분명히 반환해야합니다. 그렇지 않으면 제한 시간 규칙이 적용됩니다. – PhilDW