로컬 컴퓨터의 Windows 서비스가 시작된 후 중지됨 오류


104

일반적으로 다음과 같은 오류가 발생합니다. (로컬 컴퓨터의 "서비스 이름"서비스가 시작된 후 중지되었습니다. 일부 서비스는 다른 서비스 나 프로그램에서 사용하지 않는 경우 자동으로 중지됩니다.) 존재하지 않는 코드와 같이 내 코드에 문제가있을 때 드라이브 경로 등. Windows 서비스가 시작되지 않습니다.

크기 제한에 도달하면 폴더 / 파일을 위치에 백업하는 Windows 서비스가 있습니다. 세부 정보는 모두 Windows 서비스가 시작할 때 읽는 XML 구성에 의해 제공됩니다. 내 Windows 서비스의 onstart가 수행하는 작업을 정확히 수행하는 단추가있는 별도의 Windows 양식이 있습니다. Windows 서비스에 코드를 넣기 전에 코드를 디버깅하기 위해 Windows 양식을 사용합니다.

Windows Forms를 시작할 때. 할 일을합니다. Windows 서비스 OnStart () 메서드에 내 코드를 넣으면 오류가 나타납니다.

내 코드는 다음과 같습니다.

protected override void OnStart(string[] args)
{

    private static string backupConfig = @"D:\LogBackupConfig\backupconfig.xml";
    private static string serviceStat = @"D:\LogBackupConfig\Status.txt";
    private static string fileFolderStat = @"D:\LogBackupConfig\FileFolderStat.txt";

    protected override void OnStart(string[] args)
    {
        if (File.Exists(backupConfig))
        {
            FileSystemWatcher watcher = new FileSystemWatcher();
            XmlTextReader reader = new XmlTextReader(backupConfig);

            XmlNodeType type;
            List<string> listFile = new List<string>();
            string fileWatch = "";

            //this loop is for reading XML elements and assigning to variables
            while (reader.Read())
            {
                type = reader.NodeType;
                if (type == XmlNodeType.Element)
                {
                    if (reader.Name == "File")
                    {
                        reader.Read();
                        fileWatch = reader.Value;
                    }
                    else if (reader.Name == "Folder")
                    {
                        reader.Read();
                        fileWatch = reader.Value;
                    }
                }
            }
            reader.Close();

            watcher.Path = fileWatch;
            watcher.Filter = "*.*";

            //this loop reads whether the service will watch a file/folder
            XmlTextReader reader1 = new XmlTextReader(backupConfig);
            while (reader1.Read())
            {
                type = reader1.NodeType;
                if (type == XmlNodeType.Element)
                {
                    if (reader1.Name == "File")
                    {
                        watcher.IncludeSubdirectories = false;
                        watcher.Changed += new FileSystemEventHandler(OnChangedFile);
                    }
                    else if (reader1.Name == "Folder")
                    {
                        watcher.IncludeSubdirectories = true;
                        watcher.Changed += new FileSystemEventHandler(OnChangedFolder);
                    }
                }
            }
            reader1.Close();

            watcher.EnableRaisingEvents = true;

        }
        else
        {
            StreamWriter sw = new StreamWriter(serviceStat, true);
            sw.WriteLine("File not found. Please start the Log Backup UI first.");
            sw.Close();
        }
    }

Windows 서비스가 시작되지 않는 이유를 모르겠지만 Windows Form Simulator가 제대로 작동했습니다. 무엇이 문제인 것 같습니까?

업데이트 : 여러 번의 시도 끝에 폴더 디렉터리 (파일 없음) 만 사용하면 Windows 서비스가 작동하지 않는다는 것을 알게되었습니다. fileWatch 변수를 특정 파일 (디렉토리 포함)로 바꾸면 Windows 서비스가 시작되었습니다. 폴더 위치로 다시 변경했을 때 작동하지 않았습니다. 내가 생각하는 것은 폴더 위치가 파일 감시자에서 작동하지 않는다는 것입니다.

폴더 위치를 감시하는 새 Windows 서비스를 만들려고했을 때 작동했습니다. 그러나 원래 Windows 서비스에서 동일한 위치를 시도했을 때 작동하지 않았습니다! 나는 mindf $ # * ed했다! 새 코드 / 함수를 배치 할 때마다 새 Windows 서비스를 만들고 설치 프로그램을 만들어야하는 것 같습니다. 이렇게하면 오류가 발생한 위치를 추적 할 수 있습니다.

답변:


202

서비스가 이와 같이 시작되고 중지되면 코드에서 처리되지 않은 예외가 발생하고 있음을 의미합니다. 이것은 디버그하기 매우 어렵지만 몇 가지 옵션이 있습니다.

  1. Windows 이벤트 뷰어를 참조하십시오 . 일반적으로 컴퓨터 / 서버 관리자로 이동 한 다음 이벤트 뷰어 -> Windows 로그 -> 응용 프로그램 을 클릭하면이 작업을 수행 할 수 있습니다 . 여기에서 예외가 발생한 원인을 확인할 수 있습니다. 도움이 될 수 있지만 스택 추적은 얻지 못합니다.
  2. 프로그램 로직을 라이브러리 클래스 프로젝트로 추출하십시오. 이제 프로그램의 두 가지 버전, 즉 디버깅 용 콘솔 앱과 Windows 서비스를 만듭니다. (이것은 약간의 초기 노력이지만 장기적으로 많은 불안감을 덜어줍니다.)
  3. 더 많은 try / catch 블록을 추가하고 앱에 로깅을 추가하여 진행 상황을 더 잘 파악하세요.

10
Windows 이벤트 뷰어는 전체 스택 추적, 매우 유용한 도구를 보여줍니다.
Talha Imam

37

이것이 도움이 될지는 모르겠지만 서비스 디버깅을 위해 OnStart 메서드에서 항상 다음을 사용할 수 있습니다.

protected override void OnStart(string[] args)
{
     System.Diagnostics.Debugger.Launch();
     ...
}

Visual Studio를 프로세스에 연결하고 더 나은 디버그 기능을 가질 수있는 것보다.

이것이 도움이 되었기를 바랍니다. 행운을 빕니다


이것은 (적어도 나에게는) 단연 최고의 솔루션입니다. VS 2015는 이것을 잘 처리합니다. 저에게는 JIT 디버거에 대한 UAC 확인 대화 상자가 표시되고 VS 2015를 디버거로 선택하겠습니다.
Smitty

9

나는 단순히 다음과 같이 프로그램을 변경하여 기존 Windows 서비스콘솔 로 변환하는 것이 매우 편리하다는 것을 알았습니다 . 이 변경으로 Visual Studio에서 디버깅하거나 실행 파일을 정상적으로 실행하여 프로그램을 실행할 수 있습니다. 그러나 Windows 서비스로도 작동합니다. 나도 그것에 대한 블로그 게시물을 만들었습니다

program.cs

class Program
{
    static void Main()
    {
        var program = new YOUR_PROGRAM();
        if (Environment.UserInteractive)
        {
            program.Start();
        }
        else
        {
            ServiceBase.Run(new ServiceBase[]
            {
                program
            });
        }
    }
}

YOUR_PROGRAM.cs

[RunInstallerAttribute(true)]
public class YOUR_PROGRAM : ServiceBase
{
    public YOUR_PROGRAM()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        Start();
    }

    protected override void OnStop()
    {
        //Stop Logic Here
    }

    public void Start()
    {
        //Start Logic here
    }
}


2

EventLog.Log는 "Application"으로 설정되어야합니다.


이 나를 위해 실제로 문제에 대한 솔루션이었습니다으로 난 그냥 upvoted
야만인

1

한편, 또 다른 이유 : 실수로 .config를 삭제했습니다. 파일을 하면 동일한 오류 메시지가 나타납니다.

"로컬 컴퓨터의 서비스가 시작되었다가 중지되었습니다. 일부 서비스가 자동으로 중지됩니다 ..."


0

타이머 및 틱 이벤트를 사용하여 파일을 복사하십시오.

서비스를 시작할 때 시간을 시작하고 시간 간격을 지정하십시오.

따라서 서비스는 계속 실행되고 파일을 ontick으로 복사합니다.

도움이 되었기를 바랍니다.


0

초기화 단위 테스트를 원할 수 있지만 OnStart 메서드 거의 불가능합니다. 초기화 코드를 별도의 클래스로 이동하여 테스트하거나 적어도 양식 테스터에서 재사용 할 수 있도록 제안합니다.

둘째, 일부 로깅 ( Log4Net 또는 이와 유사한 사용)을 추가하고 자세한 로깅을 추가 하여 런타임 오류에 대한 세부 정보를 볼 수 있습니다. 런타임 오류의 예는 AccessViolation특히 서비스가 구성 파일에 액세스 할 수있는 충분한 권한없이 실행중인 경우입니다.


0

서비스를 실행하는 계정이 D :-드라이브를 매핑하지 않았을 수 있습니다 (사용자 별). 디렉토리를 공유하고 backupConfig.

귀하 watcher의 유형 FileSystemWatcher은 지역 변수이며 OnStart메서드가 완료 되면 범위를 벗어납니다 . 인스턴스 또는 클래스 변수로 필요할 수 있습니다.


0

나는 같은 문제를 만났습니다. 내 서비스는 XMLS를 업로드 / 수신하고 이벤트 로그에 오류를 기록합니다.

이벤트 로그로 이동했을 때 필터링을 시도했습니다. 이벤트 로그가 손상되었다는 메시지가 표시됩니다.

이벤트 로그를 지우고 모두 확인했습니다.


0

우리의 경우에는 문제가있는 서비스가 시작된 후 중지되었다는 로그를 제외하고 Windows 이벤트 로그에 아무것도 추가되지 않았습니다.

서비스의 CONFIG 파일이 유효하지 않은 것으로 밝혀졌습니다. 잘못된 CONFIG 파일을 수정하면 문제가 해결되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.