Agendador de Tarefas do Windows Server: Execução do executável agendado à prova de falhas?

2

Eu tenho um executável que eu programou para executar uma vez a cada cinco minutos (usando o Agendador de Tarefas embutido do Windows). É crucial que este executável seja executado porque atualiza alguns arquivos críticos de tempo. Mas como posso reagir se o servidor virtual que executa o executável ficar inativo? Em nenhum momento não deve haver mais de 15 minutos de intervalo entre as corridas.

Como estou usando o Windows Server e seu Agendador de Tarefas, imagino que seja possível criar algum tipo de cluster que lide automaticamente com a situação? O problema é que o servidor em questão está sendo executado no Windows Azure e não acho que posso criar clusters reais usando as máquinas virtuais.

Se o problema puder ser resolvido usando uma ferramenta de terceiros, tudo bem também. Para generalizar a questão um pouco: Como garantir que um executável seja executado uma vez a cada 5 minutos, mesmo que haja falhas no servidor?

    
por Mikael Koskinen 24.09.2012 / 09:53

1 resposta

1

Se você não pode agrupar, mas você pode ter várias máquinas na mesma rede, então você pode envolver seu executável em um pouco de powershell.

No primeiro servidor, quando você o executa, você cria um arquivo para indicar sucesso. O segundo servidor, em seguida, executa um código separado para procurar pelo arquivo temporário. Se ele não existir, será iniciado.

Servidor 1

$strDateTime = Get-Date -Format ddMMyy-hh:mm
$strPathtoTempFile = "D:\TempFile"
$strPathtoEXE = "D:\BIN\file.exe"

IF((Test-Path $strPathtoTempFile) -eq 'True'){remove-item $PathtoTempFile}

Start-Process $strPathtoEXE -Wait
If($Lastexitcode -eq 0){$strDateTime | Out-File $strPathtoTempFile}

Salve isso como um arquivo .PS1 no servidor 1 e aponte sua tarefa agendada para "C: \ windows \ system32 \ windowspowershell \ v1.0 \ powershell.exe D: \ BIN \ script.ps1" .

Importante para testar se o seu executável retorna algo para $ Lastexitcode, se funcionar. De outro modo, ele nunca escreverá o arquivo de saída. O ponto disso é que ele irá capturar qualquer falha, mesmo se o servidor estiver disponível, mas o executável não for executado corretamente. Se isso não funcionar, tente '$?' no lugar de $ Lastexitcode. Isso retornará verdadeiro ou falso. Mais uma vez você precisará testá-lo.

No Servidor 2, execute-o como uma tarefa agendada, mas execute-o a cada cinco minutos, iniciando em 1 minuto pas a programação no primeiro servidor:

Servidor 2

$strDateTime = Get-Date -Format ddMMyy-hh:mm
$strPathtoTempFile = "\Server1\TempFile"
$strPathtoEXE = "D:\BIN\file.exe"

IF((Test-Path $strPathtoTempFile) -eq 'Flase')
    {
    Start-Process $strPathtoEXE
    Send-Mailmessage -smtpserver smtp.server.com -to [email protected] -from [email protected] -subject "Launched on backup" -body "Executable failed on server1, ran from backup server on $strDateTime"
    }

Isso deve fornecer um pouco da redundância de que você precisa.

* Eu não testei isso, mas você deve chegar perto

    
por 24.09.2012 / 12:49