【问题标题】:How to keep Windows Service running after computer is restarted?电脑重启后如何保持Windows服务运行?
【发布时间】:2020-02-20 11:12:15
【问题描述】:

我有这个 Windows 服务(使用 SqlDependency),它每次启动时都会向我发送一封电子邮件,并且每次在我的销售表中插入新行时(数据库启用了 Service Broker)。 我还写了一个日志文件来注册服务启动时,数据插入到表中,邮件是否成功发送以及服务停止时。

  • 当我手动启动服务时,它运行良好。
  • 然后我关闭了我的电脑,然后再次打开并在我的表中插入了数据 在数据库中,但什么也没发生(没有发送电子邮件,也没有 在我的日志文件中注册)。
  • 我手动重新启动了服务,它又可以正常工作了。
  • 关闭并再次打开电脑,没有任何反应。
  • 我做了一些研究并将初始化类型更改为自动 并再次尝试。然后什么也没发生。
  • 我将初始化类型更改为自动延迟并尝试 再次。但它也不起作用,即使在我打开电脑 1 小时后也是如此。
  • 现在我手动重启了服务并且日志文件注册了 服务停止并启动,我收到了该服务的电子邮件 开始,在我在我的数据库表中插入数据后,两个日志 注册和电子邮件工作正常。

每次它不起作用时,我检查了 Windows 中的服务管理器,它被标记为“正在运行”。

我不知道我是否需要在我的代码或我的服务属性中配置一些不同的东西。 有人遇到过这个问题吗?

编辑

我修改了我的服务并包含了一个计时器,因此每过一分钟它就会在我的日志文本文件中写入时间。重启电脑后,日志文件继续每分钟记录时间,但没有记录我在数据库表中所做的插入。

我的猜测是,当 PC 重新启动时,服务可能会丢失数据库连接,因此SqlDependency 无法检测到更改。这有意义吗?

【问题讨论】:

  • 与编程无关。我们有一个单独的数据库管理站点 (dba.stackexchange.com)
  • 抱歉,我认为我必须在代码中进行一些更改才能使其正常工作。谢谢!
  • 记录您的服务执行。如果它被标记为正在运行,它应该至少执行一些序列。也许服务执行在某些部分崩溃,因为某些 Windows 部分尚未初始化。例如工作网络连接、数据库服务器尚未启动等
  • @MichalZhradnkNono3551 我目前正在制作一个日志文件(在代码执行期间,它会在文本文件中写入一些我确定的消息)。还有其他方法可以记录吗?
  • @Gabic 还有很多其他方法,但文件日志应该足以发现问题。也许您还应该检查 Windows 中的事件查看器以获取一些信息。但是由于您的服务没有崩溃并且仍在运行,您可能找不到您要查找的内容。

标签: c# windows-services service-broker sqldependency


【解决方案1】:

您的服务依赖于 SQL Server,但您的服务可能在 SQL Server 启动或启动完成之前启动。这可能会导致您的SqlDependency 失败。

您可以将您的服务标记为依赖于 SQL Server,这意味着:

  • 在 SQL Server 启动并准备就绪之前,Windows 不会尝试启动您的服务,并且
  • 启动您的服务将导致 Windows 在启动您的服务之前启动 SQL Server

这可以使用sc 命令在命令行上实现(需要在管理命令提示符下运行)。如果您的 SQL Server 实例名为 MSSQLSERVER,而您的服务名为 MyService,则命令如下所示:

sc config MyService depend= MSSQLSERVER

注意:= 之后和MSSQLSERVER 之前的空格很重要。详细语法见docs.microsoft.com

此命令成功运行后,您将在“控制面板”>“管理工具”>“服务”中查看服务属性时看到以下内容:

【讨论】:

  • 我这样做并重新启动了服务,现在它显示错误消息Error 1075: the dependency service does not exist or has been marked for deletion。即使重新启动计算机并尝试启动服务,它仍然显示相同的错误
  • 您是否将MSSQLSERVER 替换为您计算机上的SQL Server windows 服务的名称?您收到的错误让我怀疑您没有..?请注意,服务的名称将在“服务”控制面板中 SQL Server 服务属性的“常规”选项卡上显示为“服务名称”,不要假设您的名称将被称为 MSSQLSERVER,特别是如果您重新使用 SQL Server Express 版本
  • 是的,我将其更改为我的服务器名称。该服务正在我的机器上运行,而 SqlServer 正在 SqlServer 2014 数据库服务器上运行。有影响吗?
  • 命令执行成功,但是当我打开服务属性时,它并没有像你的那样显示SQL Server,它只是空的
  • 显示名称和服务名称总是不一样的。在 cmd 行发现什么在运行:sc query type= service > services.txt
猜你喜欢
  • 2011-07-15
  • 1970-01-01
  • 2014-11-04
  • 1970-01-01
  • 2014-06-26
  • 2016-03-25
  • 1970-01-01
  • 2013-02-05
  • 1970-01-01
相关资源
最近更新 更多