Cancelar / bloquear uma tarefa acionada com atraso pelo windows “task scheduler”

5

Isto está relacionado a um problema específico, mas eu acho que é uma questão "interessante" para uso geral: No Windows (especificamente servidor 2k8, para mim) você tem uma tarefa que é acionada por um evento (especificamente, o UPS vai na bateria porque a energia falhou) com um atraso (a bateria dura pelo menos 15 minutos) e depois executa alguma ação (especificamente, desligamento / s / t 60 / d U: 6: 12). Mas há algum outro evento (especificamente, o no-break está DESLIGADO da bateria porque a energia foi restaurada) que deve bloquear a primeira tarefa (especificamente, não desligue) se isso acontecer durante o atraso.

Comecei a pensar sobre isso porque o software para gerenciar o desligamento do servidor que acompanha o meu no-break é puro ... ah, eu deveria ser educado aqui, não é? ... muito ... não muito bom. Então, eu estava pensando em como fornecer o desligamento padrão antes que a bateria acabasse sem a funcionalidade. Normalmente, o sistema receberia uma mensagem do no-break de que a bateria estava prestes a acabar e depois desligou. Este no-break não envia essa mensagem. Ele envia "Estou na bateria", "estou no ar" e isso. é. isto. Nenhuma mensagem para "Estou prestes a morrer".

Mas eu acho que isso poderia ser um truque útil para outras situações também. Sempre que houver algo que você queira fazer depois que algo estiver acontecendo por um tempo sem recuperação. Por exemplo. Se você não conseguir se comunicar com um PC remoto por algum período de tempo, envie uma mensagem para a régua de energia inteligente para desligá-lo ... Mas não se a comunicação for restaurada. Ou se você não conseguiu obter dados de uma fonte por algum período de tempo, mude para uma fonte de dados de backup ... Mas não se a fonte primária começar a responder.

Isso pode ser feito? Eu não vejo um jeito ...

    
por James Newton 15.12.2014 / 18:35

2 respostas

3

Estendendo a abordagem de Ryan usando 2 tarefas, uma acionada por "Power Gone" e uma tarefa de botão "abortar", acionada por um evento "Power Restore"

Caso você precise fazer algo mais genérico (nem todos os executáveis têm um interruptor de aborto como shutdown ), e deseja manter um buffer de alguns minutos antes de começar a enviar e-mails para o gerenciamento, limpar discos ou autodestruir o datacenter (ou qualquer outra coisa que você queira automatizar em uma emergência), você pode fazer com que o primeiro pare / espere um pouco, e faça com que a segunda tarefa pare a primeira se acionada:

Tarefa do PowerGone:

Send-MailMessage -To "[email protected]" -Body "Self-destruction sequence initiated, T-10m"
# We can still abort this task
Start-Sleep -Seconds 600
Send-MailMessage -To "[email protected]" -Subject "Notice of termination..."
Start-Implosion -Force

Tarefa do PowerBack:

$TaskScheduler = New-Object -ComObject Schedule.Service
$TaskScheduler.Connect("localhost")

$TargetTask = $TaskScheduler.GetFolder('\').GetTask('PowerGone')
$TargetTask.Stop()
    
por 15.12.2014 / 23:26
6

Esta é uma boa idéia. Eu escreveria isso para você em Powershell ou C #, em poucas horas, por uma taxa muito modesta. ;)

Brincadeira. Que tal isso ...

Use o Agendador de Tarefas para criar duas tarefas. Cada tarefa será acionada em um evento de log de eventos. A tarefa número um será acionada com base no evento "A energia elétrica acabou" e executaria uma ação como shutdown /s /t 1200 para desligar o sistema com um atraso de 1.200 segundos. Em seguida, a segunda tarefa será acionada com base no evento do log de eventos para "a energia CA foi restaurada". A segunda tarefa executará um shutdown /a para abortar o encerramento pendente.

Acho que qualquer coisa mais avançada do que isso precisará ser roteirizada.

    
por 15.12.2014 / 22:58