Benutzer mit den meisten Antworten
Script nach Neustart eines Remotesystems fortsetzen

Frage
-
Invoke-XenServer:Host.Reboot -Host $server
start-sleep -s 180
Connect-XenServer -server $server -UserName root -Password $password
Hallo zusammen,
mit dem oben gezeigtem Part lasse ich mein Script warten bis der angesprochene XenServer rebootet ist. Das dies so wie dort geschrieben recht statisch ist würde ich das Script gerne so anpassen, dass ich zB bei der ersten erfolgreichen Antwort auf einen Ping wieder den Connect starte.
Kann mir da jemand den richtigen Wink geben? Bei meinen jetzigen Versuchen mit ping und test-connection verpackt in ein do while bin ich leider nicht erfolgreich gewesen...
MfG, Maikel Gädker
- Bearbeitet Maikel Gaedker Samstag, 1. Dezember 2012 23:25
Antworten
-
Hallo Maikel!
Was du da vorhast ist das klassische so genannte "polling". Man fragt einen Zustand regelmäßig solange ab, bist der zustand sich ändert.
Wenn man etwas regelmäßig wiederholt tun möchte, nimmt man eine Schleife ;-)
In deinem Fall bietet sich die Do…While schleife an, da der Ping ausgeführt werden soll und erst dann wenn der Ping erfolgreich war wird die Schleife abgebrochen.
DO{}While (-not (Test-Connection localhost))# hier geht's nur weiter wenn der Rechner erreichbar ist
Wenn der Rechner nicht erreichbar ist dann läuft die Schleife ewig! Dein Script hat sich aufgehängt ;-)
Damit die Schleife nicht ewig läuft gibt man mit einem Zähler vor, wie viele versuche es geben soll bevor die Schleife abgebrochen wird.
$MaxVersuche = 10 $I = 0 DO{ $I++ # hochzählen Write-Host "Versuch Nr.: $I" } While ((-not (Test-Connection GibtEsNicht -count 1 -ErrorAction Silentlycontinue)) -and $I -lt $MaxVersuche ) # hier gehts nur weiter wenn der Rechner erreichbar ist # oder 10 Versuche abgelaufen sind
Wenn man eine Bestimmte Zeit Pingen will, kann man den Befehl Start-Sleep nehmen und die Zeit mit dem Versuchs-Zähler multiplizieren.
Die folgende Schleife läuft etwa Maximal 1 Minute (4*15 Sekunden), wenn man die Zeit für den Ping nicht mitberücksichtigt.
$MaxVersuche = 4 $I = 0 DO{ $I++ # hochzählen Write-Host "Versuch Nr.: $I" # Zeit warten bis zum nächsten Versuch Start-Sleep -Seconds 15 } While ((-not (Test-Connection GibtEsNicht -count 1 -ErrorAction Silentlycontinue)) -and $I -lt $MaxVersuche ) # hier gehts nur weiter wenn der Rechner erreichbar ist # oder 4 Versuche * 15 Sekunden abgelaufen sind
Damit man nach der Schleife auch weiß ob der Rechner nun erreichbar war oder nicht, wird das Ergebnis von Test-Connection in einer Variablen gespeichert.
$Rechner = "GibtEsNicht" # Startwerte für die Schleife $MaxVersuche = 5 $I = 0 $PingOK = $False $Sekunden = 20 # Rechner in einer Schleife anpingen DO{ $I++ # hochzählen # Zeit warten bis zum nächsten Versuch Start-Sleep -Seconds $Sekunden # Pingen nur ein Ping pro Versuch! (-count = 1) $PingOK = Test-Connection $Rechner -count 1 -ErrorAction SilentlyContinue } While ((-not ($PingOK)) -and $I -lt $MaxVersuche ) # hier gehts nur weiter wenn der Rechner erreichbar ist # oder 5 Versuche * 20 Sekunden abgelaufen sind # Ergebnis des Pings auswerten If($PingOK){ Write-Host "Rechner $Rechner erreicht mit $I Versuchen" } Else { Write-Host "Rechner $Rechner NICHT erreicht mit $I Versuchen" }
Lies dazu auch mal meinen Tipp im Englischen PowerShell Magazin. Dort habe ich eine Funktion für genau diesen Fall veröffentlicht:
http://www.powershellmagazine.com/2012/10/19/pstip-how-to-speed-up-the-test-connection-command/
Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
German ? Come to German PowerShell Forum!
- Bearbeitet Peter Kriegel Dienstag, 4. Dezember 2012 07:57
- Als Antwort markiert Maikel Gaedker Dienstag, 4. Dezember 2012 13:15
-
Selbst gefunden und das eigentlich schon länger. Problem an der Stelle war nur, dass der XenServer ewig als down angezeigt wird obwohl er via Netzwerk noch erreichbar ist. Daher bin ich immer von einem Fehler in meiner Abfrage ausgegangen...
if (test-connection -computername $server -quiet) {Connect-XenServer -server $server -UserName root -Password $password}
MfG, Maikel Gädker
- Als Antwort markiert Maikel Gaedker Sonntag, 2. Dezember 2012 20:07
Alle Antworten
-
Selbst gefunden und das eigentlich schon länger. Problem an der Stelle war nur, dass der XenServer ewig als down angezeigt wird obwohl er via Netzwerk noch erreichbar ist. Daher bin ich immer von einem Fehler in meiner Abfrage ausgegangen...
if (test-connection -computername $server -quiet) {Connect-XenServer -server $server -UserName root -Password $password}
MfG, Maikel Gädker
- Als Antwort markiert Maikel Gaedker Sonntag, 2. Dezember 2012 20:07
-
So, nun brauch ich doch Hilfe.
test-connection läuft ja immer nur bis der mitgegebene "Ping-Count" abgelaufen ist. Ich benötige allerdings einen Dauerping der dann unterbrochen wird wenn der ping erfolgreich war.
Mein nächster Versuch aufbauend auf den obrigen Aufruf war:
if (test-connection -computername $server -quiet) {Connect-XenServer -server $server -UserName root -Password $password} else {test-connection -computername $server -quiet}
Aber auch hier wäre ja nach der else-Anweisung Schluss wenn der Counter durch ist. Mein Problem ist damit auch nicht behoben. Wie kann ich quasi nach jedem ping an Hand des Egebnisses entscheiden was passiert? Quasi ein einmaliger Ping in Dauerschleife welcher bei Antwort des Zielrechners abbricht.
MfG, Maikel Gädker
- Bearbeitet Maikel Gaedker Montag, 3. Dezember 2012 20:50
-
Hallo Maikel!
Was du da vorhast ist das klassische so genannte "polling". Man fragt einen Zustand regelmäßig solange ab, bist der zustand sich ändert.
Wenn man etwas regelmäßig wiederholt tun möchte, nimmt man eine Schleife ;-)
In deinem Fall bietet sich die Do…While schleife an, da der Ping ausgeführt werden soll und erst dann wenn der Ping erfolgreich war wird die Schleife abgebrochen.
DO{}While (-not (Test-Connection localhost))# hier geht's nur weiter wenn der Rechner erreichbar ist
Wenn der Rechner nicht erreichbar ist dann läuft die Schleife ewig! Dein Script hat sich aufgehängt ;-)
Damit die Schleife nicht ewig läuft gibt man mit einem Zähler vor, wie viele versuche es geben soll bevor die Schleife abgebrochen wird.
$MaxVersuche = 10 $I = 0 DO{ $I++ # hochzählen Write-Host "Versuch Nr.: $I" } While ((-not (Test-Connection GibtEsNicht -count 1 -ErrorAction Silentlycontinue)) -and $I -lt $MaxVersuche ) # hier gehts nur weiter wenn der Rechner erreichbar ist # oder 10 Versuche abgelaufen sind
Wenn man eine Bestimmte Zeit Pingen will, kann man den Befehl Start-Sleep nehmen und die Zeit mit dem Versuchs-Zähler multiplizieren.
Die folgende Schleife läuft etwa Maximal 1 Minute (4*15 Sekunden), wenn man die Zeit für den Ping nicht mitberücksichtigt.
$MaxVersuche = 4 $I = 0 DO{ $I++ # hochzählen Write-Host "Versuch Nr.: $I" # Zeit warten bis zum nächsten Versuch Start-Sleep -Seconds 15 } While ((-not (Test-Connection GibtEsNicht -count 1 -ErrorAction Silentlycontinue)) -and $I -lt $MaxVersuche ) # hier gehts nur weiter wenn der Rechner erreichbar ist # oder 4 Versuche * 15 Sekunden abgelaufen sind
Damit man nach der Schleife auch weiß ob der Rechner nun erreichbar war oder nicht, wird das Ergebnis von Test-Connection in einer Variablen gespeichert.
$Rechner = "GibtEsNicht" # Startwerte für die Schleife $MaxVersuche = 5 $I = 0 $PingOK = $False $Sekunden = 20 # Rechner in einer Schleife anpingen DO{ $I++ # hochzählen # Zeit warten bis zum nächsten Versuch Start-Sleep -Seconds $Sekunden # Pingen nur ein Ping pro Versuch! (-count = 1) $PingOK = Test-Connection $Rechner -count 1 -ErrorAction SilentlyContinue } While ((-not ($PingOK)) -and $I -lt $MaxVersuche ) # hier gehts nur weiter wenn der Rechner erreichbar ist # oder 5 Versuche * 20 Sekunden abgelaufen sind # Ergebnis des Pings auswerten If($PingOK){ Write-Host "Rechner $Rechner erreicht mit $I Versuchen" } Else { Write-Host "Rechner $Rechner NICHT erreicht mit $I Versuchen" }
Lies dazu auch mal meinen Tipp im Englischen PowerShell Magazin. Dort habe ich eine Funktion für genau diesen Fall veröffentlicht:
http://www.powershellmagazine.com/2012/10/19/pstip-how-to-speed-up-the-test-connection-command/
Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
German ? Come to German PowerShell Forum!
- Bearbeitet Peter Kriegel Dienstag, 4. Dezember 2012 07:57
- Als Antwort markiert Maikel Gaedker Dienstag, 4. Dezember 2012 13:15
-
Hi Peter,
ersteinmal Danke für deine ausführliche Erklärung, werde sie gleich mal testen...
Ich hatte im Eingangsposting ja schon beschrieben das ich es mit einer do-while Schleife erfolglos probiert habe (wenn ich deine Ergebnisse sehe weiß ich auch warum)
MfG, Maikel Gädker
-
Leider hast du oben in dem Code die Schleife vergessen!
Ich habe die schleife nochmal Optimiert in der Version von oben würde die Schleife immer 20 Sekunden warten auch wenn der Rechner erreichbar ist.
bessere Version:$Rechner = "GibtEsNicht" # Startwerte für die Schleife $MaxVersuche = 5 $I = 0 $PingOK = $False $Sekunden = 20 # Rechner in einer Schleife anpingen DO{ # Pingen nur ein Ping pro Versuch! (-count = 1) $PingOK = Test-Connection $Rechner -count 1 -ErrorAction SilentlyContinue # Schleife vorzeitig abbrechen wenn der Rechner Erreichbar ist If($PingOK) { break } $I++ # hochzählen # Zeit warten bis zum nächsten Versuch Start-Sleep -Seconds $Sekunden } While ((-not ($PingOK)) -and $I -lt $MaxVersuche ) # hier gehts nur weiter wenn der Rechner erreichbar ist # oder 5 Versuche * 20 Sekunden abgelaufen sind # Ergebnis des Pings auswerten If($PingOK){ Write-Host "Rechner $Rechner erreicht mit $I Versuchen" } Else { Write-Host "Rechner $Rechner NICHT erreicht mit $I Versuchen" }
Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
German ? Come to German PowerShell Forum! -
Ich hab das ganze mal an meine Bedürfnisse angepasst:
$maxCounts = 1000 $i = 0 start-sleep 30 # erst mal warten bis die Netzwerkdienste auch unten sind... do {$i++} while ((! (test-connection $server -count 1 -EA SilentlyContinue)) -and $i -lt $maxCounts) start-sleep 10 # warten bis alle Dienste wieder oben sind
Das erste start-sleep könnte ich dann natürlich noch mit einem ping abfangen ;)
MfG, Maikel Gädker
- Bearbeitet Maikel Gaedker Dienstag, 4. Dezember 2012 13:02