2017-01-17 65 views
0

我有一個腳本啓動了一個工作Start-Job,它監視一個進程。無論何時該進程死亡,腳本都會自動重新啓動進程,然後重新啓動腳本。如何知道當退出進入工作時腳本應該退出?

如果腳本無法重新啓動進程,它將發送一封電子郵件並應完全退出PowerShell,以避免重新啓動腳本。我只是在工作中退出,但這似乎並不奏效。

如何讓我的腳本無法重新啓動,如果進程無法重新啓動?

這裏是我的代碼:

$sb = { 
    while ((Get-Process LogikWebserver).Responding) { sleep -m 50 } 
    if (!(Get-Process LogikWebserver).Responding) { 
     #restart process 
     try { 
      Start-Process "$processpath\LogikWebserver.exe" -EA Stop 
      sleep -s 2 
      if (Get-Process LogikWebserver -EA Stop) { 
       Send-MailMessage 
      } 
     } catch { 
      Send-MailMessage 
      <# With this exit I want to tell the script to exit completely #> 
      exit 
     } 
    } 
} 

# start and get job 
Start-Job -Name LogikWebserverWatch -ScriptBlock $sb 
Wait-Job -Name LogikWebserverWatch 
Get-Job -Name LogikWebserverWatch | Remove-Job -Force 

# restart script 
$skript = "{0}\{1}" -f $PSScriptRoot, "Watch-LogikWebserver.ps1" 
& $skript 

回答

1

的腳本塊內不要捕捉異常。接收工作輸出並在那裏捕獲異常。此外,使用無限循環重新運行作業,而不是重新運行腳本。

$sb = { 
    while ((Get-Process LogikWebserver).Responding) { 
     Start-Sleep -Milliseconds 50 
    } 

    # restart process (at this point .Responding was already false, thus no 
    # point in checking again) 
    Start-Process "$processpath\LogikWebserver.exe" -ErrorAction Stop 
    Start-Sleep -Seconds 2 
    if (Get-Process LogikWebserver -ErrorAction Stop) { 
     Send-MailMessage 
    } 
} 

while ($true) { 
    # start and get job 
    try { 
     Start-Job -Name LogikWebserverWatch -ScriptBlock $sb | 
      Wait-Job | 
      Receive-Job -ErrorAction Stop 
    } catch { 
     Send-MailMessage 
     exit 
    } finally { 
     Get-Job -Name LogikWebserverWatch | Remove-Job -Force 
    } 
} 
+0

謝謝!因此,如果任何事情會在作業中拋出錯誤,「Receive-Job」也會引發錯誤?使用'-ErrorAction停止'可以使用 – Balthazar

+0

。 –