오류 1053 : 서비스가 시작 또는 제어 요청에 적시에 응답하지 않았습니다.
최근에 Windows 서비스로 실행되는 몇 가지 응용 프로그램을 상속했으며 두 응용 프로그램 모두에 GUI (시스템 트레이의 컨텍스트 메뉴에서 액세스 할 수 있음)를 제공하는 데 문제가 있습니다.
Windows 서비스에 대한 GUI가 필요한 이유는 중지 / 다시 시작하지 않고도 Windows 서비스의 동작을 재구성 할 수 있기 때문입니다.
내 코드는 디버그 모드에서 잘 작동하고 상황에 맞는 메뉴가 나타나고 모든 것이 올바르게 작동합니다.
이름이 지정된 계정 (예 : 로컬 시스템 계정이 아님)을 사용하여 "installutil"을 통해 서비스를 설치하면 서비스가 제대로 실행되지만 시스템 트레이에 아이콘이 표시되지 않습니다. "데스크톱과 상호 작용"옵션이 있습니다).
하지만 여기에 문제가 있습니다. "LocalSystemAccount"옵션을 선택하고 "데스크톱과 상호 작용"옵션을 선택하면 서비스가 명백한 이유없이 AGES를 시작하는 데 걸리고 계속 표시됩니다.
로컬 컴퓨터에서 ... 서비스를 시작할 수 없습니다.
오류 1053 : 서비스가 시작 또는 제어 요청에 적시에 응답하지 않았습니다.
덧붙여서, 레지스트리 해킹 ( http://support.microsoft.com/kb/824344 참조 , 섹션 3에서 TimeoutPeriod 검색)을 통해 Windows 서비스 시간 제한을 기본 30 초에서 2 분 으로 늘 렸지만 서비스는 계속 시작됩니다. 시간 초과.
내 첫 번째 질문은-서비스가 비 LocalSystemAccount로 로그인 할 때보 다 "로컬 시스템 계정"로그인이 너무 오래 걸리고 Windows 서비스 시간 초과가 발생하는 이유는 무엇입니까? 이 둘 사이의 차이점은 시작시 다른 행동을 유발할 수 있습니까?
둘째-한 걸음 물러서서 내가 달성하려는 것은 단순히 구성을위한 GUI를 제공하는 Windows 서비스입니다. 비 로컬 시스템 계정 (이름이 지정된 사용자 / 비밀번호 사용)을 사용하여 실행하면 매우 기쁩니다. 데스크탑과 상호 작용할 서비스를 얻을 수 있다면 (즉, 시스템 트레이에서 컨텍스트 메뉴를 사용할 수 있습니다). 이것이 가능합니까? 그렇다면 어떻게합니까?
위의 질문에 대한 조언을 주시면 감사하겠습니다!
며칠 동안이 메시지와 싸운 후 친구가 릴리스 빌드를 사용해야한다고 말했습니다. 디버그 빌드를 InstallUtil하면이 메시지가 표시됩니다. 릴리스 빌드가 정상적으로 시작됩니다.
서비스가 사용자의 데스크톱과 직접 상호 작용하도록 계속 시도하면 잃게됩니다. 최상의 상황에서도 (예 : "Vista 이전") 이것은 매우 까다로운 작업입니다.
Windows는 각각 자체 데스크톱이있는 여러 윈도우 스테이션을 내부적으로 관리합니다 . 주어진 계정으로 실행되는 서비스에 할당 된 윈도우 스테이션은 로그온 한 대화 형 사용자의 윈도우 스테이션과 완전히 다릅니다. 교차 창 스테이션 액세스는 보안 위험이 있기 때문에 항상 눈살을 찌푸 렸지만 이전 Windows 버전에서는 몇 가지 예외가 허용되었지만 Vista 이상 운영 체제에서는 대부분 제거되었습니다.
서비스가 시작시 중단되는 가장 가능성이 높은 이유는 존재하지 않는 데스크톱과 상호 작용을 시도하거나 (또는 Explorer가 시스템 사용자 세션 내에서 실행되고 있다고 가정) 보이지 않는 데스크톱의 입력을 기다리고 있기 때문입니다. .
만 이 문제에 대한 신뢰성 수정 서비스에서 모든 UI 코드를 제거하고 (예를 들어, 실행 글로벌 시작 그룹을 사용하여 시작할 수 있습니다) 대화 형 사용자 세션 내에서 실행이있는 별도의 실행 파일로 이동하는 것입니다.
UI 코드와 서비스 간의 통신은 모든 RPC 메커니즘을 사용하여 구현할 수 있습니다. 명명 된 파이프는 특히이 목적에 적합합니다. 통신 요구가 최소한 인 경우 응용 프로그램 정의 서비스 제어 관리자 명령 을 사용하는 것도 트릭을 수행 할 수 있습니다.
UI와 서비스 코드를 이렇게 분리하려면 약간의 노력이 필요합니다. 그러나 이것이 작업을 안정적으로 작동하도록하는 유일한 방법이며 앞으로도 잘 제공 될 것입니다.
부록, 2010 년 4 월 : 이 질문은 여전히 인기가 있으므로 데스크톱과 상호 작용하는 것과 같은 재미있는 작업을 시도하지 않는 .NET 서비스와 관련된 "서비스가 응답하지 않았습니다 ..."오류를 일으키는 또 다른 일반적인 시나리오를 수정하는 방법이 있습니다. 하지만, 이렇게 사용 인증 코드는 어셈블리에 서명 : 비활성화로드시 Authenticode 서명의 검증 게시자 증거를 만들기 위해 당신의 .exe.config 파일에 다음과 같은 요소를 추가하여 :
<configuration>
<runtime>
<generatePublisherEvidence enabled="false"/>
</runtime>
</configuration>
게시자 증거는 거의 사용되지 않는 CAS (코드 액세스 보안) 기능입니다. 서비스가 실제로 PublisherMembershipCondition에 의존하는 드문 경우에만 문제가 발생합니다. 다른 모든 경우에는 더 이상 런타임에서 값 비싼 인증서 검사 (해지 목록 조회 포함)를 수행 할 필요가 없으므로 영구적이거나 간헐적 인 시작 실패가 사라집니다.
내 서비스를 실행하는 상자에 프레임 워크가 없어서이 문제에 직면했습니다. 상자에는 .NET 4.0이 있었고 서비스는 .NET 4.5 위에 작성되었습니다.
상자에 다음 다운로드를 설치하고 다시 시작했고 서비스가 정상적으로 시작되었습니다. http://www.microsoft.com/en-us/download/details.aspx?id=30653
서비스 시작을 디버그하려면 서비스 OnStart()
메서드 맨 위에 다음을 추가합니다 .
while(!System.Diagnostics.Debugger.IsAttached) Thread.Sleep(100);
디버그-> 프로세스에 연결 ...을 사용하여 Visual Studio 디버거를 수동으로 연결할 때까지 서비스가 중단됩니다.
참고 : 일반적으로 사용자가 서비스와 상호 작용해야하는 경우 GUI 구성 요소를 사용자가 로그인 할 때 실행되는 별도의 Windows 응용 프로그램으로 분할하는 것이 좋습니다. 그런 다음 명명 된 파이프 또는 다른 형식의 IPC와 같은 것을 사용합니다. GUI 앱과 서비스 간의 통신을 설정합니다. 실제로 이것이 Windows Vista에서 가능한 유일한 방법입니다.
OnStart 메서드 내의 서비스 클래스에서 큰 작업을 수행하지 않고 OS는 서비스를 실행하는 데 짧은 시간을 예상하고 스레드 시작을 사용하여 메서드를 실행합니다.
protected override void OnStart(string[] args)
{
Thread t = new Thead(new ThreadStart(MethodName)); // e.g.
t.Start();
}
저는 여기서 눈을 멀게하고 있지만 서비스 시작의 긴 지연이 네트워크 기능 시간 초과로 인해 직간접 적으로 발생한다는 사실을 자주 발견했습니다. 종종 계정 SID를 조회 할 때 도메인 컨트롤러에 연락하려고 할 때 종종 간접적으로 발생합니다. GetMachineAccountSid()
인식 여부에 관계없이 해당 함수는 RPC 하위 시스템에 의해 호출되기 때문입니다.
이러한 상황에서 디버깅하는 방법에 대한 예는 Mark Russinovich의 블로그에서 The Case of the Process Startup Delays 를 참조하십시오 .
서비스에서 아래와 같이 디버그 코드를 사용하는 경우 문제가 발생할 수 있습니다.
#if(!DEBUG)
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new EmailService()
};
ServiceBase.Run(ServicesToRun);
#else
//direct call function what you need to run
#endif
이 문제를 해결하려면 Windows 서비스를 빌드하는 동안 #if 조건이있는 그대로 작동하지 않았기 때문에 제거하십시오.
대신 디버그 모드에 대한 인수를 사용하십시오.
if (args != null && args.Length > 0)
{
_isDebug = args[0].ToLower().Contains("debug");
}
내가 작성한 서비스에서 비슷한 문제가 발생했습니다. 어느 날 시작 오류에 대한 시간 초과가 발생하기 시작했습니다. 진행 상황에 따라 릴리스 및 디버그 중 하나 및 / 또는 둘 다에서 발생했습니다. System.Diagnostics에서 EventLogger를 인스턴스화했지만 어떤 오류가 발생 했든 Logger가 쓰기 전에 발생 했어야합니다.
EventLogs를 찾을 위치를 모르는 경우 VS에서 서버 탐색기 아래의 컴퓨터로 이동할 수 있습니다. 내 서비스에 대한 이벤트 로그 외에 다른 이벤트 로그를 살펴보기 시작했습니다. Application-.NETRuntime에서 시작시 오류와 관련된 오류 로그를 찾았습니다. 기본적으로 내 서비스 생성자에 몇 가지 예외가있었습니다 (하나는 EventLog 인스턴스 설정에서 예외로 판명되었는데, 이는 내 서비스 EventLog에서 로그를 볼 수없는 이유를 설명했습니다). 이전 빌드에는 분명히 다른 오류가있었습니다 (이로 인해 EventLog 설정에서 오류로 이어지는 변경 사항이 발생했습니다).
간단히 말해서 시간 초과의 이유는 다양한 예외 / 오류 때문일 수 있지만 런타임 EventLog를 사용하면 상황을 파악하는 데 도움이 될 수 있습니다 (특히 빌드가 작동하지만 다른 빌드가 작동하지 않는 경우).
도움이 되었기를 바랍니다!
제 경우에는 문제에 .net framework
.
내 서비스 사용
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
그러나 .net Framework
서버 버전이 4 였으므로 4.5를 4로 변경하면 문제가 해결되었습니다.
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
</startup>
서비스의 디버그 빌드를 설치하고 디버거를 서비스에 연결하여 무슨 일이 발생하는지 확인하십시오.
여기에 mdb의 의견을 반영하고 싶습니다. 이 길을 가지 마십시오. 서비스에 UI가 없어야합니다. "사용자 상호 작용 없음"은 서비스의 정의 기능과 같습니다.
서비스를 구성해야하는 경우 서비스가 시작시 읽는 것과 동일한 구성을 편집하는 다른 애플리케이션을 작성하십시오. 그러나이를 별개의 도구로 만드십시오. 서비스를 시작하려면 서비스를 시작하십시오. 구성하려면 구성 도구를 실행합니다.
이제 서비스의 실시간 모니터링이 필요하다면 조금 더 까다 롭습니다 (확실히 서비스에서 원했던 것입니다). 이제 프로세스 간 통신 및 기타 골칫거리를 사용해야하는 것에 대해 이야기하고 있습니다.
무엇보다도, 사용자 상호 작용이 필요한 경우 서비스가 사용자와 상호 작용하지 않기 때문에 여기서 실제로 연결이 끊어집니다.
당신의 입장에서 나는 물러서서 왜 이것이 서비스가되어야하는지 물 을 것입니다 . 그리고 왜 사용자 상호 작용이 필요한 가요?
이 두 가지 요구 사항은 매우 호환되지 않으므로 경보가 발생합니다.
릴리스 DLL을 복사하거나 디버그 모드가 아닌 릴리스 모드에서 dll을 가져 와서 설치 폴더에 붙여 넣으면 작동합니다.
나는이 문제가 있었고 그것은 이틀 동안 나를 미치게 만들었다… 당신의 문제가 나의 것과 비슷한 경우 :
내 Windows 서비스에 "사용자 설정"설정이 있으므로 서비스를 중지하고 시작하지 않고도 서비스가 자체 유지 관리를 수행 할 수 있습니다. 문제는 "사용자 설정"에 있습니다.이 설정에 대한 구성 파일은 service-exe 파일 버전으로 Windows 서비스를 실행하는 사용자의 사용자 프로필 아래 폴더에 저장됩니다.
어떤 이유로이 폴더가 손상되었습니다. 폴더를 삭제하고 서비스가 정상적으로 다시 시작됩니다.
이 문제가 있었는데 고치는 데 하루 정도 걸렸습니다. 나에게 문제는 내 코드가 "주요 내용"을 건너 뛰고 효과적으로 몇 줄을 실행 한 다음 끝났다는 것입니다. 그리고 이것은 나에게 오류를 일으켰습니다. Windows 서비스를 설치하는 C # 콘솔 응용 프로그램입니다. ServiceController (sc.Run ())로 실행하려고하면 바로이 오류가 발생합니다.
메인 콘텐츠로 이동하도록 코드를 수정하면 의도 한 코드가 실행됩니다.
ServiceBase.Run(new ServiceHost());
그런 다음 나타나지 않았습니다.
많은 사람들이 이미 말했듯이 오류는 무엇이든 될 수 있으며 사람들이 제공하는 솔루션은 문제를 해결할 수도 있고 해결하지 못할 수도 있습니다. 문제가 해결되지 않으면 (예 : Debug 대신 Release, 구성에 generatePublisherEvidence = false 추가 등) 문제가 자신의 코드에있을 가능성이 있습니다.
sc.Run ()을 사용하지 않고 코드를 실행 해보십시오 (즉, sc.Run ()이 실행했을 코드를 실행하도록하십시오).
이 문제는 일반적으로 어셈블리에 누락 된 참조가 있고 일반적으로 런타임에 바인딩이 실패 할 때 발생합니다.
디버그 Thread.Sleep(1000)
하려면 main()
. 다음 실행 줄에 중단 점을 넣습니다.
그런 다음 프로세스를 시작하고 시작하는 동안 디버거를 프로세스에 연결합니다. 중단 점에 도달 한 후 f5 키를 누릅니다. 어셈블리 또는 참조 누락 예외가 발생합니다.
이 오류가 해결되기를 바랍니다.
일단 exe 파일을 실행하십시오. 나는 같은 문제가 있었지만 exe 파일을 두 번 클릭하여 직접 실행하면 대상 컴퓨터에 설치되지 않은 프레임 워크로 서비스 프로젝트를 릴리스했기 때문에 .Net 프레임 워크 버전에 대한 메시지가 표시되었습니다.
127.0.0.1 crl.microsoft.com을 "호스트"파일에 추가하면 문제가 해결되었습니다.
몇 시간이 걸렸는데 이벤트 뷰어 get_AppSettings ()를 봤어야했습니다 .
앱 구성 변경으로 인해 문제가 발생했습니다.
내 문제는 Windows 서비스 구성에 언급 된 대상 프레임 워크로 인해 발생했습니다.
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6"/>
</startup>
Windows 서비스를 설치하려는 내 서버는이 .Net 버전에서 지원되지 않습니다.
어느 것을 변경하면 문제를 해결할 수 있습니다.
나도이 문제가 있었다. 로그온 계정을 로컬 시스템 계정으로 변경하여 작동하도록 만들었습니다. 내 프로젝트에서는 로컬 서비스 계정으로 실행되도록 설정했습니다. 그래서 설치했을 때 기본적으로 로컬 서비스를 사용하고있었습니다. .net 2.0과 VS 2005를 사용하고 있습니다. 따라서 .net 1.1 SP1을 설치해도 도움이되지 않았습니다.
Both Local System Account and Local Service would not work for me, i then set it to Network Service and this worked fine.
In my case, I had this trouble due to a genuine error. Before the service constructor is called, one static constructor of member variable was failing:
private static OracleCommand cmd;
static SchedTasks()
{
try
{
cmd = new OracleCommand("select * from change_notification");
}
catch (Exception e)
{
Log(e.Message);
// "The provider is not compatible with the version of Oracle client"
}
}
By adding try-catch block I found the exception was occuring because of wrong oracle version. Installing correct database solved the problem.
I also faced similar problem and found that there was issue loading assembly. I was receiving this error immediately when trying to start the service.
To quickly debug the issue, try to run service executable via command prompt using ProcDump http://technet.microsoft.com/en-us/sysinternals/dd996900. It shall provide sufficient hint about exact error.
http://bytes.com/topic/net/answers/637227-1053-error-trying-start-my-net-windows-service helped me quite a bit.
This worked for me. Basically make sure the Log on user is set to the right one. However it depends how the account infrastructure is set. In my example it's using AD account user credentials.
In start up menu search box search for 'Services' -In Services find the required service -right click on and select the Log On tab -Select 'This account' and enter the required content/credentials -Ok it and start the service as usual
In case you have a windows form used for testing, ensure that the startup object is still the service and not the windows form
We have Log4Net configured to log to a database table. The table had grown so large that the service was timing out trying to log messages.
open the services window as administrator,Then try to start the service.That worked for me.
- Build project in Release Mode.
- Copy all Release folder files to source path.
- Execute Window service using command prompt window in administrative access.
- Never delete files from source path.
At lease this works for me.
Release build did not work for me, however, I looked through my event viewer and Application log and saw that the Windows Service was throwing a security exception when it was trying to create an event log. I fixed this by adding the event source manually with administration access.
I followed this guide from Microsoft:
- open registry editor, run --> regedit
- Locate the following registry subkey: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application
- Application 하위 키를 마우스 오른쪽 단추로 클릭하고 새로 만들기를 가리킨 다음 키를 클릭합니다.
- Windows 서비스에서 사용되는 이벤트 소스 이름을 키 이름으로 입력합니다.
- 레지스트리 편집기를 닫습니다.
제 경우에는 AD의 사용자 계정에 대한 권한이었습니다 . 올바르게 설정하면 완벽하게 작동합니다.
'Nice programing' 카테고리의 다른 글
목록의 새 전체 복사본 (복제본)을 만드는 방법 (0) | 2020.12.06 |
---|---|
TypeError : $ (…) .DataTable은 함수가 아닙니다. (0) | 2020.12.06 |
Response.Cookies보다 Request.Cookies를 언제 사용합니까? (0) | 2020.12.06 |
유효하지 않은 이메일 주소를 찾기위한 SQL 스크립트 (0) | 2020.12.06 |
DateRange 객체를 만들어야합니까? (0) | 2020.12.05 |