该服务运行得很好,如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-Service和Start-Service (在1.0中可用)。 其次,自己没有testing过,你需要做两件事:
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 +)。