服务运行正常,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-Service
和Start-Service
(它在 1.0 中可用吗?)。其次,尽管我自己没有测试过,但您需要做两件事:
- 将您的脚本置于无限循环中,并让其处于睡眠状态,或者每分钟从任务计划程序中启动脚本。
- 更改您
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+ 才有)。