Windows 서비스의 실질적인 용도는 무엇입니까? [닫은]


18

Windows 서비스를 처음 사용합니다. VS2010에서 Windows 서비스 를 만드는 법을 배웠지 만 Windows 서비스를 사용할 수있는 실용적인 방법을 알고 싶습니다.

Windows 컨텍스트를 만드는 방법에 대한 추가 자습서를 찾기 위해 현재 컨텍스트를 염두에두고 인터넷 검색을 시도했습니다.

바운티 상품 편집 :

모든 답변은 훌륭하지만 Windows 서비스 및 그 의미에 대한 더 실용적인 예 를 찾고 있었습니까? 이를 통해 개발자는 사례 연구에 적합한시기를 알 수 있습니다.


28
실용적인 예? 지금 Windows 상자에서 실행되는 모든 서비스는 어떻습니까?
yannis

3
또는 * nix 박스에서 실행되는 모든 데몬
jk.

1
방송 라디오에서 클래식 음악을 녹음하고 싶습니다. 프로그램으로 오전 2시에 일어나서 "record"버튼을 눌러야합니다. 서비스를 통해 사전에 조치를 예약하고 평화롭게 잠을 잘 수 있습니다. 프로그램은 TV입니다. 서비스는 VCR입니다.
Kilian Foth

답변:


42

컴퓨터에 아무도 로그온하지 않아도 서비스는 백그라운드에서 실행됩니다. 앱을 시작하고 버튼을 클릭하기 위해 사람에게 의존하지 않고 원하는 것을 상상할 수있는 것은 서비스의 좋은 후보입니다. 예를 들어, 폴더를 모니터링하고 파일을 쓸 때마다 어떤 방식 으로든 처리하십시오. 웹 서버, ftp 서버, 메일 서버 등 생각할 수있는 모든 "서버"는 서비스이므로 자주 생각하지 않을 수있는 많은 백그라운드 프로세스가 있습니다.

한 번 서비스로 작성된 파일 (오전 2시에 백업 파일, 오전 3시에 알림 이메일 보내기 등)은 아마도 예약 된 작업으로 더 잘 수행 될 수 있습니다.이 작업은 Windows 7 이상에서 큰 유연성을 제공하지만 개발자가이를 배우지 못한 경우에는 시스템은 XP를 지원해야하며 이러한 종류의 작업을 수행하는 서비스도 찾을 수 있습니다.


1
+1. 좋은 대답입니다. 당신은 내가 데이터베이스 백업을 복용 해결 방법을 생각 나게합니다. 이전에는 백업을 수행하기 위해 exe를 호출하는 스케줄러를 통해 서버에서 SQL 프로 시저를 실행했습니다. 실행 된 exe는 팝업 된 다음 자체적으로 닫힙니다. Windows 서비스가 더 나은 옵션이라고 생각합니다.
Karthik Sreenivasan

8
아닙니다. 이 작업은 여전히 ​​연결을 수신 할 필요가 없습니다. 예약 된 작업은 이러한 종류의 문제를 해결하는 올바른 방법입니다.
Wyatt Barnett

2
NTver <6.0에서도 많은 예약 된 작업을 실행하고있었습니다. . .
Wyatt Barnett

1
@Polynomial : 예약 된 작업은 적어도 NT5 +에 대해 모든 계정에서 실행될 수 있습니다. 무인으로 실행되는 모든 것은 로깅을 수행해야하므로 실패한 이유를 파악할 수 있습니다.
Wyatt Barnett

1
좋은 설명 :). 내가 일하는 회사의 현재 이미징 시스템은 Windows 서비스를 광범위하게 사용하여 파일 처리를 처리합니다. 이미지를 시스템으로 스캔 한 후 인덱싱을 위해 대기열에 보관 한 다음 전자 메일, 인쇄 또는 팩스를 통해 이미지를 출력하기까지 모든 Windows 서비스입니다.
kelleystar

9

Windows의 서비스는 기본적으로 GUI없이 실행되는 프로그램입니다. 웹 서버 (예 : 아파치), 데이터베이스 서버 (예 : mysql & sql 서버), 안티 바이러스 엔진 및 응용 프로그램 / 미들웨어 서버는 모두 종종 서비스로 실행되는 응용 프로그램의 실제 예입니다. 서비스와 상호 작용할 수있는 GUI 클라이언트가있을 수 있지만 서비스 자체에는 서비스가 없습니다. 그것은 단지 '배경에서'실행하고 있습니다. 또한 서비스는 할당 된 사용자 권한으로 실행 되므로 할당 된 사용자로 실행할 수 있습니다.사용자가 실제로 컴퓨터에 로그인했는지 여부 따라서 데이터베이스 서버는 당시 머신에 로그인 한 사람이있는 경우에 상관없이 동일한 액세스 권한을 갖습니다. 따라서 왜 중요한지 알 수 있습니다. 예를 들어 웹 서버를 계속 실행하기 위해 사용자를 계속 로그인하지 않아도됩니다.

그것들은 * nix의 데몬과 Windows에 해당합니다 (가장 실용적인 방법으로).


5

서비스

특히 하드웨어 수준이 낮은 수준에서 다른 프로그램을 지원하기 위해 특정 시스템 기능을 수행하는 프로그램, 루틴 또는 프로세스. 서비스가 네트워크를 통해 제공되면 서비스 중심 관리 및 사용을 용이하게하는 Active Directory에 서비스를 게시 할 수 있습니다.

Windows 서비스를 사용할 수있는 실용적인 방법을 알고 싶습니다.

서비스 정의에 따라 Window Service 및 기타 유형의 서비스는 많은 기능을 수행합니다. 이러한 맥락에서 검색 엔진은 당신의 친구 입니다.

Windows 서비스는 일반적으로 응용 프로그램을 지속적으로 실행해야 할 때 사용됩니다. 사용자 상호 작용없이 백그라운드에서 코드를 실행하려면 Windows 서비스를 만들어야합니다 .

아무도 로그온하지 않아도 Windows 서비스가 실행됩니다. 컴퓨터의 전원이 켜지 자마자 Windows 서비스가 실행되기 시작할 수 있습니다 . 예를 들어 서버 (http 서버)로 실행하기에 이상적입니다. 아무도 로그인 할 필요가 없습니다.

예를 들어 필요한 경우 :

  1. 들어오는 요청을 기다립니다. (원격 또는 wcf를 통해)
  2. 대기열, 파일 시스템 등을 모니터링합니다. 프로그램을 하루에 한 번 정기적으로 실행해야하는 경우. 일반적으로 예약 된 작업을 만드는 것이 더 쉽습니다.
  3. 메일, 웹 또는 FTP 서버와 같은 연결을 수락하는 모든 서버는 일반적으로 Windows 서비스 여야합니다.

다음과 같은 이유로 서비스를 사용합니다.

  • 세션을 실행할 필요가 없습니다. 이것은 보안에 좋고 서버의 오버 헤드를 줄입니다.
  • 일부 관리 명령이 무료로 제공됩니다.
    o 시작
    o 중지
    o 일시 중지
    o 계속

  • 시스템 종료와 같은 서버 이벤트를 처리 할 수 ​​있습니다.

이 서비스에 대한 추가 정보가있는 링크 :

Asp.net에서- // TODONT : 예약 된 프로세스를 실행하기
위해 Windows 서비스 사용 WIndows 서비스 사용


Windows 서비스를 최고 권한으로 실행하는 방법 예를 들어 예약 된 작업은 stackoverflow.com/a/11561410/206730을 참조하십시오 . IMHO, 학습 곡선을 최소화하기위한 더 나은 샘플은 전체 소스 코드와 좋은 패턴을 가진 실제 응용 프로그램입니다.
Kiquenet

4

winform 또는 WPF와 같은 대화식 프로그램은 사용자가 열고 상호 작용하고 닫으려고하는 것입니다. 예약 된 작업은 특정 시간에 백그라운드에서 실행하려는 작업입니다. 시작, 작업 및 중지 일 수 있습니다. Windows 서비스는 당신이 백그라운드에서 모든 시간을 실행하려면 무언가이다.

Windows 서비스의 일부 장점은 로그인 한 사용자 또는 로그인 한 사용자가 없어도 실행되며 컴퓨터를 부팅하자마자 실행되도록 설정할 수 있다는 것입니다. 시스템이 재부팅됩니다.

폴더 나 이메일받은 편지함과 같은 것을 모니터링해야 할 때 일반적으로 서비스를 사용했습니다.


3

귀하의 질문에 실용적인 예제에 대한 메모를 추가 했으므로 엔터프라이즈 응용 프로그램 용으로 작성한 서비스의 예를 제공합니다 (엔터프라이즈 응용 프로그램 프로그래머인지는 말하지 않지만 대부분의 C # VS2010 프로그래머는 내 추측입니다) . Microsoft에서 작동하지 않는 개발자가 작성할 수있는 아이디어를 찾고 있다고 생각합니다.

다른 프로그램이 여전히 실행 중인지 확인한 하트 비트 모니터 서비스입니다 (예약 된 작업으로 작동했지만 서비스로 구현 된 경우).

보고서 요청 대기열을 통해 작동하고 보고서를 실행하여 사용중인 프린터에 따라 다른 프린터로 전송하는 보고서 작성 서비스입니다. 이는 레거시 애플리케이션에서 상당한 양의 작업을 오프로드하는 데 도움이되었으며 서비스를 실행하는 여러 개의 저렴한 박스에서 보고서 실행을 공유 할 수있었습니다.

이 서비스는 지속적으로 실행되고 재부팅시 자동으로 시작되며 표준 Windows 서비스 인터페이스를 사용하여 시작, 중지, 일시 중지 등을 수행 할 수 있도록 서비스로 구현되었습니다. 또한 예약 된 작업 인 경우에는 다른 프로그램이 호출 할 수있는 것 (소켓, 파이프)이 아닌 다른 프로그램 또는 영구 소스 (큐, 파일, 데이터베이스)에서 데이터를 가져 오기 시작합니다.

해당 클라이언트 / 서버 응용 프로그램의 서버 부분도 재부팅으로 다시 시작되도록 서비스로 구현되었습니다. .exe를 사용 하여 서비스가 아닌 동일한 프로그램을 실행 한 다른 프로젝트가 더 쉬워졌습니다. 개발 머신에서 디버그합니다.

도움이 되길 바랍니다. 다른 답변은 더 나은 일반적인 답변, 특히 예약 된 작업이 현재 대부분의 목적을 위해 작성하고 관리하기 쉽다는 생각입니다.


+1 Windows 서비스가 사용되는 위치를 자세히 설명합니다. 소켓 (포트를 통해 IPAddress를 통해 통신하는 클라이언트 서버 모델)에 대한 노출이 제한되어 있지만 일반적으로 파이프를 사용하지 않았습니다. 파이프와 소켓이 비슷한 역할을합니까?
Karthik Sreenivasan

2

서비스에는 실질적으로 많은 용도가 있습니다. 실용적으로 사용되는 한 가지 방법은 UI와 서비스 (또는 UNIX의 데몬) 프로그램 간의 상호 작용이며,이 경우 클라이언트와 서버의 차이점입니다. 서버는 요청을 수신하고 요청을 처리하며 대개 회신을 보냅니다. 즉, 요청을 제공합니다. SQLSERVER, IIS 또는 텔넷에 대해 생각해보십시오. 클라이언트는 일반적으로 서버에 요청을 보낸 후 응답을 표시하거나 처리하여 서버를 사용합니다. 즉, 데이터 입력 응용 프로그램, 웹 응용 프로그램 ... 서버는 거의 항상 Windows (또는 Unix의 데몬)의 서비스로 설치되며 클라이언트는 일반적으로 GUI가있는 일반 응용 프로그램입니다. 더 복잡한 서비스 사용 방법이 있지만 가장 많이 사용하는 방법입니다.

예를 들어 : 현재 SIP / H323 비디오 서버에서 작업하고 있습니다. 내가 작성한 SDK를 사용하여 응용 프로그램에서 요청을 받고 처리 한 후 회신합니다. 비디오 서버 응용 프로그램은 포함 된 Linux 시스템에 데몬으로 설치되며 (임베디드 Windows 시스템에서는 서비스이지만 임베드에 Windows를 사용하는 사람) SDK를 사용하는 모든 응용 프로그램은 클라이언트로 간주됩니다.

물론 이러한 응용 프로그램을 작성하여 서비스로 만들 수는 없습니다. 여전히 Windows를 시작할 때 시작하고 백그라운드에서 실행되도록 할 수 있습니다. 그러나 몇 가지 레지스트리 항목과 코드에서 약간의 오류가 발생하므로 .NET과 같은 것보다 c api를 사용하는 것이 훨씬 쉽습니다. 반면에 Microsoft는 서비스를 생성하고 OS에 서비스를 등록하여 훨씬 쉽게 만들었습니다. 수동으로 수행하는 것보다 훨씬 간단하고 구현하기 쉽습니다.


+1-명확히하기 위해 서비스는 서버에서 Windows 서비스로 호스팅 된 다음 클라이언트 SDK가 포트를 통해 서버로 정보를 보내 데이터를 전달하여 피드백을받습니다. 내 이해가 정확합니까?
Karthik Sreenivasan

1
@Karthik, 디자인 패턴이나 내 예를 언급하고 있습니까? 전자의 경우, yes .. 또는 Unix의 데몬. 통신은 어떤 형태의 TCP / IP 일 것입니다. 내 예제를 언급하면 ​​비디오 서버는 임베디드 Linux 시스템의 데몬입니다. SDK는 포트를 통해 통신하며 비디오 서버에는 클라이언트 요청을 처리하는 데 사용하는 청취 루프가 있습니다.
Jonathan Henson

@Karthik, 그건 그렇고, TCP / IP 또는 파이프 일 필요는 없습니다. 사람들이 슬롯이있는 신호를 사용하여 프로세스 간 통신을 수행하는 것을 보았습니다. 그러나 디자인 패턴은 동일합니다. 의사 소통 방법은 프로젝트 설계자에게 달려 있습니다.
Jonathan Henson

나는 그 예를 언급하고 있었다.
Karthik Sreenivasan

2

후보 프로그램의 예 :

  • 리소스 / 기타 응용 프로그램을 모니터링하고 보고서 (사용자 활동, 특정 종류의 파일 트래픽, 응용 프로그램 오류 알림)를 보내야하는 시스템

  • 다른 로컬 응용 프로그램에 서비스를 제공하는 시스템 (번역, 파일 변환, 시스템 간 메시징)

  • 바이러스 백신 소프트웨어.

예약 된 작업으로는 쉽게 수행 할 수없는 큰 예라고 생각합니다.


예제는 +1입니다. 파일 트래픽에 대해 간략히 말씀해 주시겠습니까?
Karthik Sreenivasan

1
예를 들어 파일 업로드에서 산발적 인 급증을 볼 수있는 웹 응용 프로그램이있는 경우 누군가에게 알리고 싶을 것입니다. 또한 이는 앨리어싱으로 인해 예정된 확인으로 감지되지 않을 수있는 이상한 시간 (예 : 웹 트래픽, 프로세서 사용량)에 급등을 볼 수있는 모든 리소스에 적용됩니다.
linkerro

2

내가 좋아하는 서비스 사용 예 :

  1. 서버 -원격 클라이언트의 요청을 처리하는 프로그램. 이들은 일반적으로 서비스로 실행되어 사용자가 서버에 로그인했는지 여부에 관계없이 사용 가능한지 확인합니다. 서비스로 실행한다는 것은 머신이 시작 되 자마자 서버가 요청 처리를 시작한다는 것을 의미합니다. 어떤 이유로 든 머신을 재시작 한 후 아무도 머신에 로그인하지 않아도 프로그램을 시작할 수 있습니다. 데이터베이스 서버가 좋은 예입니다.
  2. 백그라운드 처리 -데이터 소스의 데이터를 처리하고 결과를 데이터 대상에 저장하는 프로그램입니다. 데이터 대상은 종종 다른 프로세스의 소스입니다. 서비스로 실행하면 해당 프로그램이 그 자리에 앉아 데이터가 도착할 때까지 기다릴 수 있습니다. 또한 개발자는 프로세스를 여러 개의 반독립 단계로 분할하여 처리의 견고성을 향상시킬 수 있습니다.

데이터베이스 서버의 경우 +1 상황이 떨어지고 있습니다. 우리는 모두 SqlConnection 또는 OledbConnection을 사용하여 실제로 서버에있는 서비스에 의해 처리되는 데이터베이스에 연결합니다.
Karthik Sreenivasan

2

다음은 실제 코드와 함께 서비스 개념의 샘플 사용법입니다 (아래 참조).

큐에서 소비하고 웹 서버 및 클라이언트 GUI의 메시지를 수신하는 서비스 버스를 구성하는 것입니다.

메시지를 수신하면 도메인이 보증하는 논리를 수행하고 이벤트를 디스크에 저장하고 해당 이벤트를 메시지 브로커에 공개합니다.

느슨하게 결합 된 대부분의 더 큰 응용 프로그램은 아래와 같은 일종의 "작업자"아키텍처를 구현합니다.

Documently 프로젝트는 여러분과 같은 사람들이 분산 아키텍처를 배우기 위해 만든 샘플 프로젝트입니다. 프로젝트에서 나에게 직접 질문하거나 포크하고 일부 기능을 구현하여 풀 요청을 제출하고 코드 주석을 얻을 수 있습니다.

https://github.com/haf/Documently/blob/master/src/Documently.Domain.Service/Program.cs :

using System.Threading;
using Castle.MicroKernel.Registration;
using Castle.Windsor;
using Documently.Infrastructure;
using Documently.Infrastructure.Installers;
using MassTransit;
using Topshelf;
using log4net;
using log4net.Config;

namespace Documently.Domain.Service
{
    class Program
    {
        private static readonly ILog _Logger = LogManager.GetLogger(typeof (Program));

        private IWindsorContainer _Container;
        private IServiceBus _Bus;

        public static void Main(string[] args)
        {
            Thread.CurrentThread.Name = "Domain Service Main Thread";
            HostFactory.Run(x =>
            {
                x.Service<Program>(s =>
                {
                    s.ConstructUsing(name => new Program());
                    s.WhenStarted(p => p.Start());
                    s.WhenStopped(p => p.Stop());
                });
                x.RunAsLocalSystem();

                x.SetDescription("Handles the domain logic for the Documently Application.");
                x.SetDisplayName("Documently Domain Service");
                x.SetServiceName("Documently.Domain.Service");
            });
        }

        private void Start()
        {
            XmlConfigurator.Configure();
            _Logger.Info("setting up domain service, installing components");

            _Container = new WindsorContainer()
                .Install(
                    new RavenDbServerInstaller(),
                    new CommandHandlerInstaller(),
                    new EventStoreInstaller(),
                    new BusInstaller(Keys.DomainServiceEndpoint)
                    );

            _Container.Register(Component.For<IWindsorContainer>().Instance(_Container));
            _Bus = _Container.Resolve<IServiceBus>();

            _Logger.Info("application configured, started running");
        }

        private void Stop()
        {
            _Logger.Info("shutting down Domain Service");
            _Container.Release(_Bus);
            _Container.Dispose();
        }
    }
}

예를 들어 +1 더 나은 이해를 위해 귀하의 모범을 보이도록 노력하겠습니다.
Karthik Sreenivasan

2

얼마 전 우리 팀은 브라질의 은행에서 3 개의 Windows 서비스를 아래와 같이 구현했습니다.

  • 시스템 간 인터페이스 : 주식 시장에서의 거래 예약을 담당하는 프론트 오피스 애플리케이션과 거래 수수료를 계산하고 계산하는 백 오피스 애플리케이션이있었습니다. 처음에는 시스템 간 통신이 SQL Server에서 직접 이루어졌지만 너무 많은 잠금 및 보존 문제로 인해 시스템 성능이 저하되었습니다. 서비스는 전면 및 후면 데이터베이스에 연결하고 일종의 보존 전략을 사용하여 적절한 읽기 / 쓰기를 수행하도록 구현되었습니다 (SQL Server에서 모든 단일 거래를 작성하는 대신, 우리는 데이터를 어느 정도 확장하여 1000 거래, 대량 삽입을 수행하여 원래 솔루션보다 40 배 빠르며 관련 테이블을 오랫동안 잠그지 않았습니다.

  • Message Queue : 이전 솔루션과 함께 사용자 지정 Message Queue 처리기를 작성하여 여러 일괄 처리 절차가 비동기 적으로 실행될 수 있습니다. 이는 MSMQ 및 IBM-MQSeries와 통합되었습니다.

  • 비즈니스 서비스의 중앙 집중화 : 예를 들어 여러 사용자 응용 프로그램이 공통 데이터를 주식 가격으로 필요로했기 때문에 "가격 요청"을 받고 가격 정보를 다시 보내는 사용자 정의 서비스를 작성했습니다.

"로봇"대신 서비스를 작성하게 한 측면 중 하나는 서비스가 특정 사용자 (이 스레드에서 이미 지적한대로)로 실행될 수 있으며 시스템 부팅시 자동으로 시작될 수 있다는 것입니다.

또한 서비스를 실행하기 위해 데스크톱 또는 창 관리 서비스가 필요하지 않습니다. 백그라운드에서 실행할 수 있습니다 (배경에서 실행 해야 함 ).

그리고 사용자 인터페이스를 작성하고 싶지 않은 동료들과 마찬가지로 서비스는 큰 기술적 과제입니다. 대개 실패해서는 안되기 때문입니다. 서비스를 작성하는 것은 매우 재미 있습니다. :)


+1 라이브 예. 여기에있는 모든 사람들이 제공 한 모든 좋은 대답에서 나는 이제 Windows 서비스의 적절한 사용에 대해 더 잘 이해하고 있으며 다른 프로그래머는 여기에서 공유하는 지식에서 확실히 혜택을 볼 것이라고 생각합니다. 내가 과거에 일한 일부 구현은 Windows 서비스를 사용하여 더 잘 구현되었을 수 있습니다.
Karthik Sreenivasan

0

표준 사용자로 실행해야하지만 때로는 관리자 권한이 필요한 작업을 수행해야하는 Windows 데스크톱 응용 프로그램을 디자인하는 경우 서비스를 사용할 수 있습니다.

설치 관리자는 필요한 권한으로 서비스를 설치하고 데스크톱 응용 프로그램은 관리자 권한으로 작업을 수행해야 할 때 서비스를 호출합니다.

이 답변의 범위를 벗어난이 접근 방식에는 보안 관련 사항이 있습니다.


올바르게 이해하면 관리자 권한없이 Windows 서비스를 호출 할 수 없습니까?
Karthik Sreenivasan

2
아니요, 관리자 권한이 없으면 Windows 서비스를 설치하거나 시작할 수 없습니다. 그러나 서비스가 청취
Eclipse

1
확실히 표준 사용자는 Windows 서비스를 시작하고 호출 할 수 있습니다. 서비스는 관리자가 설치해야합니다.
Jim In Texas

0

프로그래머에게 서비스를 사용하는 주된 이유는 다음과 같습니다.

  • 이 프로그램은 재부팅 후 Windows 시스템에서 자동으로 시작해야합니다.

위 내용을 준수해야하는 모든 내용은 Windows 서비스로 실행해야합니다.


0

최종 사용자 관점에서 내가 작성한 가장 유용한 서비스 :
* 사용자는 RAW 인쇄 드라이버를 사용하는 도트 매트릭스 프린터에서 UGLY 송장을 인쇄했습니다.
* 사용자는 로고, 부드러운 라인 그래픽의 PRETTY 송장을 원했습니다.
* 레거시 코드에 액세스 할 수 없습니다.

이 서비스는 다음과 같습니다.
* 인쇄 작업을 위해 여러 프린터 폴더를 모니터링합니다.
* 송장 PDF를 작성하십시오.
* PDF는 멋진 빈 송장 이미지를 "밑받침"합니다.
* 원본 텍스트를 오버레이합니다.
* 사용중인 폴더를 기준으로 메타 데이터를 조회합니다 (IE : 사용중인 프린터)

. 메타 데이터는 다음과 같습니다.
* PDF 생성
및 / 또는 PDF 인쇄
* 및 PDF를 최종 대상 폴더에 보관
하거나 PDF를 삭제합니다.
* 및 / 또는 PDF 송장을 고객에게 이메일로 보냅니다.

이 경우 고스트 스크립트, PLC 및 PDF 엔진을 처리합니다. 몇 년 동안 아주 깨끗하게 운영되었습니다. 로그 파일 포함 !!!

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