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

일반적으로 다음과 같은 오류가 발생합니다. (로컬 컴퓨터의 “서비스 이름”서비스가 시작된 후 중지되었습니다. 일부 서비스는 다른 서비스 나 프로그램에서 사용하지 않는 경우 자동으로 중지됩니다.) 존재하지 않는 코드와 같이 내 코드에 문제가있을 때 드라이브 경로 등. 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 서비스를 만들고 설치 프로그램을 만들어야하는 것 같습니다. 이렇게하면 오류가 발생한 위치를 추적 할 수 있습니다.



답변

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

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

답변

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

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

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

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


답변

나는 단순히 다음과 같이 프로그램을 변경하여 기존 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
    }
}


답변

로컬 mahcine의 액세스 제어 목록 (ACL)에 모든 HTTP 엔드 포인트를 등록했는지 확인하십시오.

http://just2thepoint.blogspot.fr/2013/10/windows-service-on-local-computer.html


답변

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


답변

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

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


답변

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

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

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

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