【问题标题】:Call a script when a windows service is stopped intentionally有意停止 Windows 服务时调用脚本
【发布时间】:2018-04-05 15:56:10
【问题描述】:

当 Windows 服务从 Services(services.msc) 有意停止时,有没有办法调用批处理或 Powershell 脚本,我有几个任务需要在我的应用程序服务停止时执行。我有一个脚本可以检查服务的状态,如果 Windows 服务没有运行,它可以调用另一个脚本,但是它与时间安排一起工作,所以如果立即停止并启动服务,脚本将不会执行,因为服务将在那时的运行状态。

【问题讨论】:

  • 冒着听起来很愚蠢的风险,您为什么不将信号机制构建到应用程序服务本身中?到目前为止,它处于听到它的最佳位置。如果做不到这一点,您可以创建一个计划任务,该任务在您要求服务停止时触发服务控制管理器写入日志的事件,但请注意,当服务已经启动并运行时,它仍然可以运行并执行操作再说一遍——避免这种情况的唯一方法是让服务自己处理。
  • 该应用程序是专有的,因此无法更改。我有另一个应用程序服务,它就像应用程序的附加组件。我希望在我停止服务时停止我的附加应用程序。
  • 在这种情况下,轮询听起来仍然是您的最佳选择。跟踪服务进程的启动时间以检测服务是否在轮询之间重新启动。请注意,您无法确保在服务重新启动之前停止您的应用程序;这需要能够完全阻止服务启动。

标签: windows powershell batch-file windows-server-2012-r2


【解决方案1】:

您可以执行轮询服务的无限循环。

While ($True)
{
    If (-not (Get-Service -Name 'myproc')) { <# do a thing #> }
}

【讨论】:

    【解决方案2】:

    (我没有足够的代表来发表评论,所以我要留下一个“答案” - 提前抱歉!)

    据我所知,无法在服务停止之类的事件上启动脚本。您可以将 Powershell 的“Stop-Service”cmdlet 与您当前的服务监控脚本结合使用,以防止在您运行脚本时重新启动服务,然后在末尾添加一个“Start-Service”以允许它回来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多