윈도우즈 서비스에서 특정 작업을 수행할 경우,
작업이 한꺼번에 많이 몰릴 때를 대비하여 프로세스를 실행하여 작업을 처리하려고 합니다.
(기존에는 서비스 내부에서 스레드(Thread)를 생성하여 처리했었는데 문제가 많이 발생했었습니다.)
이렇게 프로세스로 처리하면 작업 중에 오류가 발생하더라도 해당 프로세스만 종료되고 윈도우즈 서비스에는 아무런 영향도 미치지 않게 됩니다.
윈도우즈 서비스는 이 글 참조하여 생성하면 됩니다.
위 글에서도 나와있지만 관리자 권한으로 Command를 실행하여 서비스를 등록해야 합니다.
그렇지 않으면 아래와 같은 오류 메시지를 뿌리고 등록에 실패하게 됩니다. 서비스에 등록했으면
하지만 서비스를 바로 실행하면 아마 아래와 같은 메시지가 뜨면서 서비스가 실행되지 않습니다. 서비스 화면에서 해당 서비스의 속성 창으로 들어가서 로그온 탭에서 계정을 로컬 시스템 계정으로 변경합니다.('서비스와 데스크탑 상호 작용 허용'을 체크해주세요.) 다시 서비스를 실행하면 서비스가 제대로 실행됩니다.
서비스에서 실행할 Console 프로그램
서비스에서 Timer를 돌려 특정 시간마다 Console 프로그램을 실행하려고 합니다.
실행 중인 Console 프로그램의 Instance의 수를 얻어 Console 프로그램 실행 여부를 판단할 수 있습니다.
Console 프로그램 개발 시 주목해야 할 것은 상호작용이 가능한 요소를 빼줘야 한다는 것입니다.
그렇게 하지 않으면 Console 프로그램이 실행되지 않습니다.
작업이 한꺼번에 많이 몰릴 때를 대비하여 프로세스를 실행하여 작업을 처리하려고 합니다.
(기존에는 서비스 내부에서 스레드(Thread)를 생성하여 처리했었는데 문제가 많이 발생했었습니다.)
이렇게 프로세스로 처리하면 작업 중에 오류가 발생하더라도 해당 프로세스만 종료되고 윈도우즈 서비스에는 아무런 영향도 미치지 않게 됩니다.
윈도우즈 서비스는 이 글 참조하여 생성하면 됩니다.
위 글에서도 나와있지만 관리자 권한으로 Command를 실행하여 서비스를 등록해야 합니다.
그렇지 않으면 아래와 같은 오류 메시지를 뿌리고 등록에 실패하게 됩니다. 서비스에 등록했으면
WIN 키() + R키를 눌러
services.msc
를 입력하여 윈도우즈 서비스 창을 엽니다.하지만 서비스를 바로 실행하면 아마 아래와 같은 메시지가 뜨면서 서비스가 실행되지 않습니다. 서비스 화면에서 해당 서비스의 속성 창으로 들어가서 로그온 탭에서 계정을 로컬 시스템 계정으로 변경합니다.('서비스와 데스크탑 상호 작용 허용'을 체크해주세요.) 다시 서비스를 실행하면 서비스가 제대로 실행됩니다.
서비스에서 실행할 Console 프로그램
서비스에서 Timer를 돌려 특정 시간마다 Console 프로그램을 실행하려고 합니다.
실행 중인 Console 프로그램의 Instance의 수를 얻어 Console 프로그램 실행 여부를 판단할 수 있습니다.
string ProcessName = "ConsoleApp1";
// Get all instances of ConsoleApp1 running on the local computer.
// This will return an empty array if ConsoleApp1 isn't running.
Process[] ProcessByName = Process.GetProcessesByName(ProcessName);
if (ProcessByName.Length == 0)
{
/// 실행중인 ConsoleApp1 프로그램이 없다면 실행
Console 프로그램 개발 시 주목해야 할 것은 상호작용이 가능한 요소를 빼줘야 한다는 것입니다.
string ExeName = @"{Path}\ConsoleApp1.exe";
// 실행파일 실행
ProcessStartInfo startInfo = new ProcessStartInfo(ExeName);
startInfo.CreateNoWindow = true;
startInfo.UseShellExecute = false;
startInfo.ErrorDialog = false;
startInfo.RedirectStandardError = true;
startInfo.RedirectStandardInput = true;
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
Process.Start(startInfo);
CreateNoWindow = true;
UseShellExecute = false;
ErrorDialog = false
로 설정했습니다.그렇게 하지 않으면 Console 프로그램이 실행되지 않습니다.
댓글
댓글 쓰기