2 votes

Réveiller un serveur web en utilisant powershell script ?

Je suis en train de construire un script qui effectue des requêtes http afin de "réveiller" certaines applications asp.net.

Le script suivant fonctionne, mais il est synchrone :

function WakeUp([string] $url)
{
    Write-Host "Waking up $url ..." -NoNewLine
    $client = new-object system.net.WebClient
    $client.UseDefaultCredentials = $true
    $null = $client.OpenRead($url)
    $client.Dispose()
    Write-Host " Ok"

}
# Run your code that needs to be elevated here
@(
    "http://app1/",
    "http://app2/",
    "http://app3/"
 ) | % { WakeUp $_ }

J'aimerais améliorer ce script pour éviter que le site cible soit réveillé. En effet, l'appel à OpenRead attend une réponse avant de revenir.

J'ai essayé d'utiliser OpenReadAsync mais l'appel à Dispose se produit avant que la requête ne soit effectivement émise et que l'application cible ne soit pas réveillée.

Quelles sont mes options ?

[Editer] En appliquant les suggestions d'Andy Arismendi, mon script est maintenant :

$WakeUp = {
    Param ([string] $url)
    try 
    {
        Write-Output "Waking up $url ..."
        $client = new-object system.net.WebClient
        $client.UseDefaultCredentials = $true
        $null = $client.OpenRead($url)
        $client.Dispose()
        Write-Output "$url Ok"
    } catch {
        Write-Error $_
        throw $_
    }
}

$jobs = @()
# Run your code that needs to be elevated here
@(
    "http://app1/",
    "http://app2/",
    "http://app3/"
 ) | % { 
    $jobs += Start-Job -ScriptBlock $WakeUp -ArgumentList $_ 
    }

Receive-Job -Job $jobs -Keep
Wait-Job -Job $jobs

Cela semble fonctionner comme prévu, mais je perds le Write-Host. Une idée ?

5voto

Andy Arismendi Points 1158

Les tâches d'arrière-plan peuvent rendre votre flux de travail asynchrone.

  • Convertir la fonction de réveil en un bloc script :

    $WakeUp = {
        ([string] $url)
    
        try {
            # Processing...
        } catch {
            throw $_
        }
    }
  • Pour chaque URL, lancer le bloc script en tâche de fond.

    @(
        "http://app1"
        # More...
    ) | % {
        Start-Job -ScriptBlock $WakeUp -ArgumentList $_
    }

Jetez un coup d'œil à mon Antwort d'une autre question pour savoir comment recevoir les données de la tâche d'arrière-plan et détecter celle qui a échoué.

Mise à jour

Cela résout le problème de la non réception de la sortie dans votre version. Vous voulez utiliser Wait-Job avant Receive-Job pour leur permettre de se terminer parce qu'ils s'exécutent de manière asynchrone.

$WakeUp = {
    param ([string] $url)
    try {
        Write-Output "Waking up $url ..."
        Start-Sleep -Seconds 3
        if ($url -eq "http://app2/") {
            throw ($url + " failed")
        }
        Write-Output "$url Ok"
    } catch {
        throw $_
    }
}

$jobs = @()
# Run your code that needs to be elevated here
@(
    "http://app1/",
    "http://app2/",
    "http://app3/"
 ) | % { 
    $jobs += Start-Job -ScriptBlock $WakeUp -ArgumentList $_ 
}

Wait-Job -Job $jobs | Out-Null
Receive-Job -Job $jobs -Keep

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X