如果日志文件中出现错误消息,请重新启动Windows服务

服务运行得很好,如sc query但它不起作用。 当它停止工作时,在日志文件中出现错误。 所以我想在日志文件上运行一个tail -f ,并在发生错误时重新启动服务。

我有Powershell版本1,所以我可以按照这个错误:

 Get-Content error.log -Wait | Select-String -pattern "I just died" 

但是我怎样才能每次发现模式执行命令?

我想要运行的命令是:

 echo "Stopping service" >> restart.log sc stop "Floffy dude" sc start "Floffy dude" Get-Date >> restart.log echo "Restart done" >> restart.log 

我不必是一个deamon。 我可以在cmd.exe中运行它。

其他可以在Windows Server 2008上运行而无需安装更多软件的解决scheme大多是受欢迎的。

编辑:基于input我想出了这个脚本:

 Get-Content -Wait error.log | Select-String -SimpleMatch "I just died" | ForEach-Object -Process { $now = Get-Date -Format "yyyy-MM-dd HH:mm" Echo "$now Restart: Floffy - $_" Restart-Service "Floffy" $now = Get-Date -Format "yyyy-MM-dd HH:mm" Echo "$now Restart done." } 

这似乎工作。

我可以从任务调度程序运行,但是我必须检查它是否是我已经响应的旧错误。

首先,你不需要sc来控制你的服务。 只需使用Stop-ServiceStart-Service (在1.0中可用)。 其次,自己没有testing过,你需要做两件事:

  1. 将脚本放在无限循环中,每隔一分钟从任务计划程序中启动睡眠或脚本。
  2. 改变你Select-String使用 – -Quiet选项返回一个bool

比它应该是那么简单

 if(Get-Content error.log -Wait | Select-String -pattern "I just died" -Quiet){ #stop and start services here } 

希望能帮助到你。

在logging了一次服务停止的长error.log上运行此操作将始终重新启动该服务,因为它总是会find“我刚才死了”的文本。 如果日志的最后一行始终是相同的“我刚死了”,如果它已经死了,那么解决方法很简单:

Get-Content error.log -Last 1

还有一件事要考虑的是,挂起的服务有时不会响应“停止服务”,你可能不得不用pskill.exe来杀死进程。 你需要testing一下。

正如Darek所说,我真的会考虑把这个放在一个预定的任务中,甚至包括一个简单的“监护人服务”。 如果你重新login,那么你不会失去太多的控制权。 如果你想得到每一次重新启动的通知,你可以直接发送一个简单的Send-MailMessage,并通过电子邮件发送给你(只有我担心PS v3 +)。