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

如果日志文件中有错误消息,请重新启动 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

我不必是守护进程。我可以在 cmd.exe 中运行它。

其他无需安装更多软件即可在 Windows Server 2008 上运行的解决方案非常受欢迎。

编辑:根据输入,我想出了这个脚本:

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."
}

它似乎有效。

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

答案1

首先,您不需要sc控制您的服务。只需使用Stop-ServiceStart-Service(它在 1.0 中可用吗?)。其次,尽管我自己没有测试过,但您需要做两件事:

  1. 将您的脚本置于无限循环中,并让其处于睡眠状态,或者每分钟从任务计划程序中启动脚本。
  2. 更改您Select-String使用-Quiet返回一个的选项bool

应该很简单

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

希望能帮助到你。

答案2

在记录了一次服务停止的长 error.log 上运行此命令将始终重新启动服务,因为它始终会找到“我刚刚死了”文本。如果服务已死,日志的最后一行始终是相同的“我刚刚死了”,那么解决方案很简单:

Get-Content error.log -Last 1

另一件需要考虑的事情是,挂起的服务有时不会响应“Stop-Service”,您可能需要使用 pskill.exe 之类的程序终止该进程。您需要对此进行测试。

正如 Darek 所说,我真的会考虑将其放入计划任务中,甚至将其包装成一个简单的“监护服务”。如果您记录重新启动,那么您就不会失去太多的控制权。如果您想在每次重新启动时都收到通知,您可以添加一个简单的 Send-MailMessage 并让它给您发送电子邮件(恐怕只有 PS v3+ 才有)。

相关内容