有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    不确定这是否是错误,但发现了一些似乎是错误的东西

    您正在检查第3行的服务状态,但您正在停止第9行的服务。然后在第16行检查状态是否正在运行。您需要再次运行Get Service以获取服务的更新状态

    您可以通过以下方式实现这一点: (Get-Service $serviceName).Status

    我的建议如下:

    $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' "
    
    start-service -name $serviceName
    
    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"
                $dateString = get-date
                $mailFrom = 'no-reply@mymailserver.com'
                $mailTo('L3LYZA@mymailserver.com')
                $mailSubject = 'URGENT ALERT - Service ' + $service + 'is' + $service.status + 'on' + $remoteServer + '.'
                $mailBody = ([string]$dateString) + 'Service' + $service + 'is' + $service.status + 'on' + $remoteServer + '.'
                Send-MailMessage -SmtpServer $smtpserver -From $mailFrom -To $mailTo -Subject $mailSubject -Body $mailBody 
                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
                    # Get an updated status from the service:
                    $service = Get-Service -name $ServiceName
                    $retryCount++
                }
            }
        }
    }
    

    请记住,我已将邮件改为本机Powershell Send MailMessage。选择“Net.Mail.MailMessage”可能是有原因的,所以如果是的话,一定要把它改回去