Acordar o servidor da web usando o script powershell?

2

Estou criando um script que realiza uma solicitação http para "ativar" alguns aplicativos do asp.net.

O script a seguir está funcionando, mas é síncrono:

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 $_ }

Gostaria de melhorar este script para evitar que o site de destino seja despertado. Na verdade, a chamada para OpenRead espera por uma resposta antes de retornar.

Eu tentei usar OpenReadAsync , mas a chamada para Dispose ocorre antes que a solicitação seja realmente emitida e o aplicativo de destino não seja ativado.

Quais são minhas opções?

[Editar] Aplicando as sugestões de Andy Arismendi, meu script agora é:

$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

Isto parece funcionar como esperado, mas perco o Write-Host. Qualquer pensamento?

    
por Steve B 06.01.2012 / 15:27

1 resposta

5

Tarefas em segundo plano podem tornar seu fluxo de trabalho assíncrono.

  • Converta a função de ativação em um bloco de script:

    $WakeUp = {
        ([string] $url)
    
        try {
            # Processing...
        } catch {
            throw $_
        }
    }
    
  • Para cada URL, gire o bloco de script como um trabalho em segundo plano.

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

Confira meu responda a partir de outra pergunta para ver como você pode receber dados do trabalho em segundo plano e detectar quais falharam.

Atualizar

Isso resolve o problema em sua versão sobre não receber saída. Você deseja usar Wait-Job antes de Receive-Job para permitir que eles sejam concluídos porque estão sendo executados de forma assíncrona.

$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
    
por 07.01.2012 / 03:28

Tags