Windows Server 서비스 프로세스 사용(pyhon과 유사한 supervisor)

11542 단어 WindowsC#
Windows Server에서 장기간 실행되는 서비스를 위해 모니터가 떨어지면 자동으로 재부팅되는 서비스 제작 방법입니다.
python과 유사한 슈퍼visor.

서비스 제작 방법


Servicebase를 계승해 OnStart()와 OnStop()의 오버라이드에 하고 싶은 일을 구현하면 좋겠다.
프로세스의 시작, 하강, 재시작, 프로세스의 정지 여부를 확인하십시오.
using System.Diagnostics;
using System.ServiceProcess;
using System.Threading.Tasks;

namespace Suporvisor
{
    class Suporvisor: ServiceBase
    {
        public static void Main()
        {
            var service = new Suporvisor();
            ServiceBase.Run(service);
            return;
        }

        const int checkIntervalMillseconds = 1000;
        const string exePath = @"C:\Supervisor\Program.exe";
        readonly object lockObject = new object();
        Process process;
        Task checker;

        public Suporvisor()
        {
            AutoLog = true;
            CanShutdown = true;
            CanStop = true;
            ServiceName = "Supervisor";
        }

        protected override void OnStart(string[] args)
        {
            log("OnStart");
            lock (lockObject)
            {
                spawnWithoutLock();
            }
            checker = check();
        }

        protected override void OnStop()
        {
            log("OnStop");
            stop();
            checker.Wait();
            ExitCode = 0;
        }

        async Task check()
        {
            while (true)
            {
                lock (lockObject)
                {
                    if (process == null)
                    {
                        return;
                    }

                    if (process.HasExited)
                    {
                        spawnWithoutLock();
                        log("find stopped process so restart");
                    }
                }
                await Task.Delay(checkIntervalMillseconds).ConfigureAwait(false);
            }
        }

        void spawnWithoutLock()
        {
            var info = new ProcessStartInfo(exePath);
            info.CreateNoWindow = true;
            info.UseShellExecute = false;
            info.RedirectStandardError = true;
            info.RedirectStandardInput = true;
            info.RedirectStandardOutput = true;
            info.CreateNoWindow = true;
            info.ErrorDialog = false;
            info.WindowStyle = ProcessWindowStyle.Hidden;

            process = Process.Start(info);
        }

        void stop()
        {
            lock (lockObject)
            {
                if (process != null)
                {
                    if (!process.HasExited)
                    {
                        process.Kill();
                    }
                    process.Close();
                    process = null;
                }
            }
        }

        void log(string format, params object[] args)
        {
            var message = string.Format(format, args);
            EventLog.WriteEntry(message);
        }
    }
}

Windows Service에 실행 파일 등록


sc.exe 명령을 사용하면 명령줄에서 서비스에 대한 등록, 삭제, 시작, 정지를 실행할 수 있습니다.
C:\Supervisor에서 완료된 프로그램을 설정합니다.
sc.exe create supervisor binPath= "C:\Supervisor\Suporvisor.exe" start= auto displayname= "Suporvisor"
sc.exe start supervisor
제어판에서 서비스 일람을 보면 방금 등록한 내용이 일람표에 추가됩니다.

이벤트 로그 확인


컨트롤 프로그램과 달리 출력이 보이지 않기 때문에 컨트롤 패널에서 이벤트 뷰어를 시작해서 로그를 확인합니다.
잘 돌아가는 것 같습니다.

총결산


로그인 서비스는 다음과 같은 장점이 있다
- Windows Server를 다시 시작할 때 자동으로 시작 가능
-서비스 프로그램 자체 충돌 시 자동으로 프로그램 재부팅 또는 실행 등 등록 반응 가능
- 표준 이벤트 뷰어를 통해 로그를 쉽게 볼 수 있습니다.

좋은 웹페이지 즐겨찾기