none
Script nach Neustart eines Remotesystems fortsetzen RRS feed

  • 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


    Samstag, 1. Dezember 2012 23:19

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!


    Dienstag, 4. Dezember 2012 07:32
  • 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

    Sonntag, 2. Dezember 2012 20:06

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

    Sonntag, 2. Dezember 2012 20:06
  • 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


    Montag, 3. Dezember 2012 20:18
  • 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!


    Dienstag, 4. Dezember 2012 07:32
  • 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

    Dienstag, 4. Dezember 2012 07:49
  • 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!

    Dienstag, 4. Dezember 2012 08:16
  • 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



    Dienstag, 4. Dezember 2012 13:00