java Powershell脚本在满足条件后未退出循环,并且在出现故障条件时被捕获
我正在编写powershell脚本,以停止和启动远程服务器上的服务。如果重新启动操作失败,我希望脚本发送电子邮件警报
脚本的目标是停止服务,休眠几秒钟,然后检查服务。如果服务未运行,请尝试启动服务并休眠,然后再检查。每次脚本无法启动服务时,它都会向retrycount添加+1,如果重试次数超过最大重试次数,脚本将触发失败通知。如果服务正在运行,它应该将重启操作标记为完成并退出循环
我遇到的问题是,当我第一次运行脚本时,它进入循环,检查服务并错误地将其标记为完成。之后我去检查服务时,服务显示已停止。当我第二次运行脚本时,它停止服务,进入循环,尝试重新启动服务,循环3次,然后捕捉到要触发和发送电子邮件警报的故障情况。它在失败状态下不断循环,数十次,直到我强制退出
我整晚都在为这件事挠头,我不知道哪里出了问题。我将在下面发布脚本:
$VerbosePreference = "continue"
$remoteServer = 'My-RemoteServer01'
$serviceName = 'MSSQLServerOLAPService'
$service = Get-Service -name $ServiceName
$maxRetries = 2
$retryCount = 0
$restartComplete = $false
stop-service -name $serviceName
write-verbose 'Service Stopped - Sleep 15s'
start-sleep -s 15
write-verbose "Attempt to restart service '$retryCount' "
while ($restartComplete -eq $false){
if ($service.status -eq 'Running')
{
$restartComplete = $true
write-verbose "restart complete"
}
else {
if ($retryCount -ge $maxRetries)
{
write-verbose "Service Restart Failed - Begin Alert"
$smtpServer = ('smtp.mymailserver.com', 00)
$msg = new-object Net.Mail.MailMessage
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$dateString = get-date
$msg.From = 'no-reply@mymailserver.com'
$msg.To.Add('L3LYZA@mymailserver.com')
$msg.subject = 'URGENT ALERT - Service ' + $service + 'is' + $service.status + 'on' + $remoteServer + '.'
$msg.body = ([string]$dateString) + 'Service' + $service + 'is' + $service.status + 'on' + $remoteServer + '.'
$smtp.send($msg)
write-verbose "Alert Sent - Complete"
}
else {
if ($service.status -ne 'Running')
{
start-service -name $serviceName
write-verbose 'Service Restarting - Sleep 45s'
start-sleep -s 45
$retryCount++
}
}
}
}
编辑:解决方案最终改变了我检查服务状态的方式。我还在失败条件中添加了一个掷骰子
$VerbosePreference = "continue"
$remoteServer = 'My-RemoteServer'
$serviceName = 'MSSQLServerOLAPService'
$service = Get-Service -name $ServiceName
$maxRetries = 2
$retryCount = 0
$restartComplete = $false
stop-service -name $serviceName
write-verbose 'Service Stopped - Sleep 15s'
start-sleep -s 15
write-verbose "Attempt to restart service '$break' "
while ($restartComplete -eq $false){
if ((Get-Service $serviceName).Status -eq 'Running')
{
$restartComplete = $true
write-verbose "restart complete"
}
else {
if ($retryCount -ge $maxRetries)
{
write-verbose "Service Restart Failed - Begin Alert"
$smtpServer = ('smtp.mymailserver.com', 00)
$msg = new-object Net.Mail.MailMessage
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$dateString = get-date
$msg.From = 'noreply@mymailserver.com'
$msg.To.Add('L3LYZA@mymailserver.com')
$msg.subject = 'URGENT ALERT - Service ' + $service + 'is' + $service.status + 'on' + $remoteServer + '.'
$msg.body = ([string]$dateString) + 'Service' + $service + 'is' + $service.status + 'on' + $remoteServer + '.'
$smtp.send($msg)
write-verbose "Alert Sent - Complete"
Throw "service restart failed exit condition met"
}
else {
if ((Get-Service $serviceName).Status -ne 'Running')
{
start-service -name $serviceName
write-verbose 'Service Restarting - Sleep 45s'
start-sleep -s 45
$retryCount++
}
}
}
}
# 1 楼答案
不确定这是否是错误,但发现了一些似乎是错误的东西
您正在检查第3行的服务状态,但您正在停止第9行的服务。然后在第16行检查状态是否正在运行。您需要再次运行Get Service以获取服务的更新状态
您可以通过以下方式实现这一点:
(Get-Service $serviceName).Status
我的建议如下:
请记住,我已将邮件改为本机Powershell Send MailMessage。选择“Net.Mail.MailMessage”可能是有原因的,所以如果是的话,一定要把它改回去