如何以编程方式停止 Windows 服务?

Posted

技术标签:

【中文标题】如何以编程方式停止 Windows 服务?【英文标题】:How to stop a Windows Service programmatically? 【发布时间】:2009-08-21 15:04:59 【问题描述】:

我正在编写一个简单的 Windows 服务,每月向所有员工发送电子邮件。我的问题是,完成后如何停止自己?我是这个领域的菜鸟,所以请帮助我。真的很感激。

它将部署在服务器上,每月运行一次。我没有开始这件事,代码就是这样给我的。它是用 VB.NET 编写的,我现在被要求更改它周围的一些东西。我注意到只有“Sub OnStart”,想知道服务什么时候停止?主子完成后,这个服务的状态如何?它是停止了还是只是挂在那里?对不起,正如我所说,我对此真的很陌生......

【问题讨论】:

【参考方案1】:

如果您有一个每月重复的任务,您最好编写一个控制台应用程序,然后使用Windows Task Scheduler 将其设置为每月运行一次。服务应该用于需要长时间或持续运行的进程,无论用户是否登录

【讨论】:

它将部署在服务器上,每月运行一次。我没有开始这件事,代码就是这样给我的。它是用 VB.NET 编写的,我现在被要求更改它周围的一些东西。我注意到只有“Sub OnStart”,想知道服务什么时候停止?主子完成后,这个服务的状态如何?它是停止了还是只是挂在那里?抱歉,正如我所说,我对此真的很陌生...... 如果您是新手,那么现在是让自己看起来不错并用 Macros 的建议接近决策者的好时机。服务不是每月使用一次,它们是连续的。对于您提到的情况,将代码从 Windows 服务中提取到控制台应用程序中非常简单。【参考方案2】:

正如所有其他答案所指出的,听起来这应该是您作为计划任务运行的可执行文件或脚本。

但是,如果由于某种原因您有义务作为 Windows 服务运行并且您在 .NET 中工作,则您只需在服务完成工作后调用从 ServiceBase 继承的 Stop() 方法。来自该方法的 MSDN 文档:

Stop 方法设置服务状态 表示停止等待,并且 调用 OnStop 方法。之后 应用程序停止,服务 状态设置为停止。如果 应用程序是托管服务, 应用程序域已卸载。

这里有一个重要的警告:运行服务的用户帐户必须有权停止服务(这是ServerFault 的主题)。

一旦服务的OnStart 方法完成,它将继续运行(什么都不做),直到有东西以下列方式之一告诉它停止:

以编程方式调用Stop 在服务本身或从 外部进程using the method Colin Gravill describes in his answer。 通过命令行。 通过 windows 计算机管理控制台的“服务”面板。

【讨论】:

【参考方案3】:

如果这是一个 Win32 服务(即用 C 或 C++ 编写),那么您只需调用 SetServiceStatus(SERVICE_STOPPED) 并从 ServiceMain 返回。

另一方面,如果您只是每月发送一次电子邮件,那您为什么还要使用服务呢?使用 Windows 任务计划程序并运行正常的应用程序或脚本。

【讨论】:

【参考方案4】:

net stop [service_name] ...在命令行上也会这样做。

但是,我同意其他人的观点;看来 Windows 任务计划程序会更好地满足您的需求。

【讨论】:

【参考方案5】:

把它写成计划任务可能会更好,最初开发肯定会更容易。然后它会自然终止,并且不会在本月的剩余时间内消耗资源。

要回答原问题,你可以在 C# 中获取当前正在运行的服务的列表

services = System.ServiceProcess.ServiceController.GetServices();

然后寻找你想要的那个并将状态设置为停止

locatedService.Status == ServiceControllerStatus.Stopped

完整示例on msdn

【讨论】:

【参考方案6】:

必须成为 Windows 服务有什么原因吗?如果没有,请遵循@Macros 解决方案。但是,如果确实如此,那为什么要停止服务呢?如果您停止它,则只需在需要发送电子邮件时重新启动它。根据您的描述,听起来它不需要很多资源,所以我建议您安装它并让它运行,每月启动一次以发送电子邮件。

【讨论】:

【参考方案7】:

这是我在类似情况下所做的。

Windows 服务 24/7 全天候运行并处理工作单元。它通过数据库视图获取工作单元。

表格消息 处理开始时间 完成DTE ... 数据库视图仅提取标记为未完成且过去有 ProcessingStartTime 的记录。因此,在服务确认事务后,它会执行一个更新数据库记录的存储过程。对于这个系统,最终用户将 excel 文件上传到 asp.net webfrom,然后将它们导入数据库。

【讨论】:

以上是关于如何以编程方式停止 Windows 服务?的主要内容,如果未能解决你的问题,请参考以下文章

停止 MySQL 服务窗口

如何创建一个启动和停止多个'exe'/'bat的Windows服务

以编程方式停止 GIF 动画

如何在 Windows 中以编程方式强制重启/重新加载 Playback 设备?

Windows 服务如何以编程方式重新启动自身?

如何在 C# 中以编程方式安装 Windows 服务?