Windows Services的实际用途是什么?[关闭]


18

我是使用Windows Services的新手。尽管我已经学会了在VS2010中创建Windows服务,但是我想知道一些使用Windows服务的实用方法?

我在考虑当前上下文的情况下尝试了谷歌搜索,只是找到了有关如何创建Windows服务的更多教程。

编辑赏金优惠:

所有的答案都很好,但我一直在寻找Windows服务及其含义的更多实际示例?这将帮助开发人员知道何时将其与案例研究一起使用是合适的。


28
实际的例子?现在在Windows机器上运行的每项服务如何?
yannis

3
或在* nix框上运行的每个守护程序
jk。

1
我喜欢从广播电台录制古典音乐。使用程序,我必须在凌晨2点起床并按“记录”按钮。有了服务,我可以提前安排行动并安静地入睡。节目是电视-服务是录像机。
Kilian Foth,2015年

Answers:


42

即使没有人登录到计算机,服务也会在后台运行。您可以想象的任何不依赖他人启动应用程序并单击按钮的操作都是提供服务的理想选择。例如,监视文件夹以及每当将文件写入文件夹时,都以某种方式对其进行处理。您可以想到的任何“服务器”(Web服务器,FTP服务器,邮件服务器)都是一种服务,因此您可能不会经常想到许多后台进程。

曾经写为服务的某些内容(凌晨2点备份文件,凌晨3点发送提醒电子邮件等)今天可以更好地作为计划任务完成,这些任务在Windows 7及更高版本上具有极大的灵活性,但是如果开发人员从未学习过,或者系统必须支持XP,您还会发现执行这些任务的服务。


1
+1。好答案。您的回答使我想起了如何解决数据库备份问题。早先进行备份时,我们曾经通过调用exe的调度程序在服务器中运行SQL过程。用来弹出然后完成的exe会自行关闭。我认为Windows服务是一个更好的选择。
Karthik Sreenivasan '02

8
不,它不会。该任务仍然不需要侦听连接。计划任务是解决此类问题的正确方法。
Wyatt Barnett'2

2
我也在NTver <6.0上运行了许多计划任务。。。
Wyatt Barnett'2

1
@Polynomial:计划任务可以在任何帐户下运行,至少适用于NT5 +。任何在无人值守的情况下运行的操作都需要进行日志记录,因此您可以找出失败原因。
Wyatt Barnett'2

1
很好的解释:)。我工作的公司当前的成像系统广泛使用Windows服务来处理文件处理。从图像扫描到系统到排队索引到存档,然后最终通过电子邮件,打印或传真输出图像,这都是Windows服务。
kelleystar

9

Windows上的服务基本上是无需GUI即可运行的程序。Web服务器(例如apache),数据库服务器(例如mysql&sql服务器),防病毒引擎和应用程序/“中间件”服务器都是经常作为服务运行的应用程序的实际示例。可能会有GUI客户端允许您与该服务进行交互,但是该服务本身没有。它只是在“后台”运行,完成其任务。此外,由于服务是在分配了用户权限的情况下运行的,因此它们可以作为分配的用户运行用户是否实际上已登录到计算机。因此,与当时登录计算机的人员(如果有)无关,数据库服务器将具有相同的访问权限。因此,您可以看到为什么这很重要-例如,您不想让用户登录才能保持Web服务器的运行。

它们在Windows上(以大多数实用方式)等效于* nix上的守护程序。


5

服务

一种程序,例程或过程,执行特定的系统功能以支持其他程序,尤其是在较低(接近硬件)级别的情况下。通过网络提供服务时,可以在Active Directory中发布这些服务,从而促进以服务为中心的管理和使用。

我想知道可以使用Windows服务的一些实用方法吗?

根据服务定义,Window Service和其他类型的服务会执行许多功能。在这种情况下,搜索引擎是您的朋友

当应用程序需要连续运行时,通常使用Windows服务。您应该创建Windows服务,以在后台运行代码,而无需用户交互

即使没有人登录,Windows服务也会运行。机器加电后Windows服务就可以开始运行,这非常适合作为服务器(例如http服务器)运行。无需任何人登录。

例如,如果他们需要:

  1. 等待传入的请求。(例如通过远程处理或wcf)
  2. 监视队列,文件系统等如果程序只需要定期运行,例如每天运行一次。通常,创建计划任务比较容易。
  3. 任何接受连接的服务器(例如邮件,Web或FTP服务器)通常应为Windows服务。

我会出于以下原因使用服务:

  • 您不需要运行会话。这对安全性有好处,还可以减少服务器的开销。
  • 您可以免费获得一些内置的管理命令
    o开始
    o停止
    o暂停
    o继续

  • 您可以处理服务器事件,例如关机。

链接有关这些服务的其他信息:

在Asp.net- // TODONT:仅使用Windows服务来运行计划的进程
什么是Windows服务


如何以最高特权运行Windows服务?例如,预定任务可以通过stackoverflow.com/a/11561410/206730查看。恕我直言,使学习曲线最小化的更好示例是具有完整源代码和良好模式的实际应用程序
Kiquenet 2014年

4

诸如winform或WPF之类的交互式程序是您希望用户打开,与之交互和关闭的程序。计划任务是您希望在特定时间在后台运行的任务-可能只是启动,执行某些操作然后停止。一个Windows服务是要在后台运行所有的时间的东西。

Windows Service的一些优点是,无论登录哪个用户(甚至没有用户登录),它都可以运行,并且可以将其设置为在计算机启动后立即开始运行,这对于Windows服务非常有用。系统重启。

当我不得不监视诸如文件夹或电子邮件收件箱之类的东西时,我通常会使用服务。


3

自从您在问题中添加了有关实际示例的注释后,我将为您提供一些我为企业应用程序编写的服务示例(您没有说您是否是企业应用程序程序员,但我想大多数C#VS2010程序员都是) 。我认为您正在寻找对不适合Microsoft的开发人员可能会写些什么的想法。

心跳监视器服务,用于检查其他程序是否仍在运行(这可能也已作为计划任务运行,但已作为服务实现)。

报表编写服务可以处理报表请求的队列,运行报表,然后根据繁忙的打印机将其发送到其他打印机。这有助于从旧版应用程序中分担大量工作,并允许运行该服务的多个廉价设备共享正在运行的报告。

它作为一项服务实现,因此它可以连续运行,在重新启动时自动启动,并能够使用标准的Windows Services界面来启动,停止,暂停等。此外,如果它是计划任务,则需要开始从其他程序或持久性源(队列,文件,数据库)获取数据,而不是供其他程序调用(套接字,管道)。

一个客户端/服务器应用程序的服务器部分也被实现为服务,以便将重启在重新启动后,等有与运行相同程序的.exe另一个项目作为一种服务,以使其更容易在开发机器上调试。

希望对您有所帮助。不过,其他答案是更好的一般答案,尤其是这样的想法,即对于大多数目的而言,计划任务现在可能更容易编写和管理。


+1用于详细说明Windows服务的使用位置。我对套接字的接触有限(客户端-服务器模型通过端口通过IPAddress进行通信),但通常没有使用管道。管道是否像插座一样发挥类似的作用?
Karthik Sreenivasan'2

2

服务有许多实际用途。一个主要的实际用途是UI和服务程序(或UNIX中的守护程序)之间的交互,在这种情况下,这就是客户端和服务器之间的区别。服务器接收请求,处理请求并通常发回答复。换句话说,它服务于一个请求。考虑一下SQLSERVER,IIS或telnet。客户端通常通过向服务器发送请求,然后显示或处理回复来利用服务器。即数据输入应用程序,Web应用程序...服务器几乎总是作为服务安装在Windows中(或Unix中的守护程序),而客户端通常只是带有gui的普通应用程序。服务有许多更复杂的用途,但这可能是您最常使用的一种。

例如:我目前正在SIP / H323视频服务器上工作。它使用我编写的SDK接收来自应用程序的请求,进行处理,然后回复。视频服务器应用程序作为守护程序安装在嵌入式linux机器上(这将是嵌入式Windows机器上的服务,但无论如何仍使用Windows进行嵌入),并且任何使用SDK的应用程序都将视为客户端。

当然,您可以编写此类应用程序而不将其用作服务。您仍然可以使它们在启动Windows时启动,并使它们在后台运行。但是,它涉及一些注册表项和代码中的某些问题-使用c api比.NET之类的操作要容易得多。另一方面,Microsoft通过创建服务并允许我们在OS中注册它们,使此操作变得更加容易。与手动完成相比,它实现起来要简单得多。


+1-为了明确起见,该服务作为Windows服务托管在服务器中,然后客户端SDK通过端口将信息发送到服务器,以传达数据以接收反馈。我的理解正确吗?
Karthik Sreenivasan '02

1
@Karthik,您是指设计模式还是我的示例?如果是前者,则为..或Unix中的守护程序。通信将是某种形式的TCP / IP。如果您参考我的示例,则视频服务器是嵌入式Linux计算机上的守护程序。SDK通过端口进行通信,视频服务器具有侦听循环,可用于处理客户端请求。
乔纳森·亨森

@Karthik,顺便说一句,它不一定是TCP / IP或管道。我已经看到人们使用带有插槽的信号来执行进程间通信。但是,设计模式是相同的。您如何交流取决于项目的架构师。
乔纳森·亨森

我指的是例子。
Karthik Sreenivasan'2

2

候选程序的示例:

  • 必须监视资源/其他应用程序并发送报告(用户活动,特定类型的文件流量,应用程序行为不正常的通知)的系统

  • 为其他本地应用程序提供服务的系统(翻译,文件转换,系统间消息传递)

  • 防毒软件。

我认为这些是使用计划任务无法轻松完成的重要示例。


+1的示例。您能简要介绍一下文件流量吗?
Karthik Sreenivasan '02

1
例如,如果您有一个Web应用程序,在文件上传中看到零星的峰值,您可能想向他人发出警报。同样,这适用于任何在怪异的时间(例如,网络流量,处理器使用率)可能会出现峰值的资源,这些峰值可能无法通过计划的检查(由于混叠)检测到。
linkerro'2

2

我最喜欢使用服务的示例:

  1. 服务器 -服务于来自远程客户端的请求的程序。它们通常将作为服务运行,以确保无论是否有任何用户登录到服务器,它们均可用。作为服务运行还意味着服务器在计算机启动后即开始处理请求,而由于任何原因重新启动计算机后,无需登录计算机即可启动程序。数据库服务器就是一个很好的例子。
  2. 后台处理 -负责处理来自数据源的数据并将结果存储到数据目标中的程序。数据目标通常是另一个进程的源,依此类推。作为服务运行允许那些程序坐在那里等待数据到达。通过将流程分成多个半独立的步骤,开发人员还可以提高处理的稳定性。

+1用于数据库服务器。事情已经到位。我们都使用SqlConnection或OledbConnection来连接到实际上由驻留在服务器中的服务处理的数据库。
Karthik Sreenivasan'2

2

这是带有真实代码的服务概念的示例用法(如下所示)。

它的作用是配置服务总线,该服务总线消耗掉队列并侦听来自Web服务器和客户端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 '02

2

前一段时间,我的团队在巴西的一家银行实施了3个Windows服务,如下所示:

  • 系统之间的接口:我们有一个前台应用程序,负责在股票市场上进行交易的预定,还有一个后台应用程序,用于对交易费用进行会计和计算。最初,系统间通信是直接在SQL Server上进行的,但是太多的锁定和保留问题使系统遭受了性能下降的困扰。实施了一项服务,以连接到前后数据库,并使用某种保留策略来进行正确的读取/写入(而不是在SQL Server上写入每笔交易,我们将数据保留一定程度的扩展,例如1000笔交易,以及进行了大容量插入,比原始解决方案快40倍,并且长时间没有锁定许多涉及的表)。

  • 消息队列:与先前的解决方案一起,我们编写了一个自定义消息队列处理程序,因此,多个批处理过程可以异步运行。该产品已与MSMQ和IBM-MQSeries集成在一起。

  • 商业服务的集中化:例如,一些用户应用程序需要通用数据作为股票价格,因此我们编写了一个定制服务,负责接收“价格请求”并发送回价格信息。

导致我们编写服务而不是“机器人”的方面之一是,服务可以作为特定用户运行(正如在该线程上已经指出的那样),并且可以在计算机启动时自动启动。

服务也不需要桌面或窗口管理服务即可运行。它们可以在后台运行(嗯,它们必须在后台运行)。

而且,如果您像我的某些同行一样不喜欢编写用户界面,则服务是巨大的技术挑战,因为通常它们一定不会失败。因此,编写服务非常有趣。:)


+1 直播示例。从这里每个人提供的所有好的答案中,我现在对Windows服务的正确使用有了更好的理解,我认为其他程序员肯定会从这里的知识共享中受益。我过去使用过的某些实现可以使用Windows服务更好地实现。
Karthik Sreenivasan '02

0

如果您设计的Windows桌面应用程序需要以标准用户身份运行,但是有时需要执行需要管理员权限的任务,则可以使用服务。

安装程序会使用所需的权限安装服务,当桌面应用程序需要执行具有管理员权限的任务时,桌面应用程序会调用该服务。

此方法存在安全隐患,超出了此答案的范围。


如果我正确理解,未经管理员许可就无法调用Windows服务?
Karthik Sreenivasan '02

2
不可以,没有管理员权限就无法安装或启动Windows服务。但是,任何用户都可以,如果服务正在侦听(认为插槽,命名管道等)与他们沟通
Eclipse的

1
当然,标准用户可以启动并调用Windows服务。该服务必须由管理员用户安装。
Jim in Texas

0

对于程序员而言,使用服务的主要原因是:

  • 重新启动后,该程序需要在Windows计算机上自动启动。

您编写的必须符合上述条件的所有内容都必须作为Windows服务运行。


0

从最终用户的角度来看,我编写的最有用的服务是:
*用户在带有RAW打印驱动程序的点矩阵打印机上打印了UGLY发票。
*用户需要带有徽标,线条流畅的图形的漂亮发票。
*无法访问旧版代码。

该服务将:
*监视(多个)打印机文件夹中的打印作业。
*创建发票的PDF。
* PDF将“覆盖”一个漂亮的空白发票图像
*覆盖原始文本
*根据使用的文件夹(即使用的打印机)查找元数据,

然后元数据将:
*生成PDF
*和/或打印PDF
*和/或将PDF归档到最终目标文件夹
*和/或删除PDF
*和/或通过电子邮件将PDF发票发送给客户

在这种情况下,它可以处理虚脚本,PLC和PDF引擎。多年来,它一直运行得非常干净。包括日志文件!!!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.