У меня есть исполняемый файл, который я запланировал запускать каждые пять минут (используя встроенный планировщик задач Windows). Очень важно, чтобы этот исполняемый файл был запущен, потому что он обновляет несколько критических файлов. Но как я могу отреагировать, если виртуальный сервер, на котором запущен исполняемый файл, выйдет из строя? Ни в коем случае не должно быть перерывов между пробежками более 15 минут.
Поскольку я использую Windows Server и его планировщик задач, мне интересно, можно ли создать какой-то кластер, который автоматически обрабатывает ситуацию? Проблема в том, что рассматриваемый сервер работает в Windows Azure, и я не думаю, что могу создавать настоящие кластеры с помощью виртуальных машин.
Если проблему можно решить с помощью стороннего инструмента, это тоже нормально. Чтобы немного обобщить вопрос: как убедиться, что исполняемый файл запускается каждые 5 минут, даже если могут быть сбои сервера?
Если вы не можете кластеризоваться, но у вас может быть несколько машин в одной сети, вы можете обернуть свой исполняемый файл в небольшой пакет PowerShell.
На первом сервере, когда вы запускаете его, вы создаете файл, указывающий на успех. Затем второй сервер запускает отдельный код для поиска этого временного файла, если он не существует, он запускается.
Сервер 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}
Сохраните это как файл .PS1 на сервере 1 и укажите в запланированной задаче "C: \ windows \ system32 \ windowspowershell \ v1.0 \ powershell.exe D: \ BIN \ script.ps1".
Важно проверить, что ваш исполняемый файл что-то возвращает в $ Lastexitcode, если он работает. В противном случае он никогда не запишет выходной файл. Дело в том, что он будет обнаруживать любые сбои, даже если сервер доступен, но исполняемый файл не может выполняться должным образом. Если это не сработает, попробуйте "$?" вместо $ Lastexitcode. Это вернет True или False. Вам снова нужно будет это протестировать.
На сервере 2 запустите это как запланированное задание, но запускайте его каждые пять минут, начиная с 1 минуты по расписанию на первом сервере:
Сервер 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 support@company.com -from executable@company.com -subject "Launched on backup" -body "Executable failed on server1, ran from backup server on $strDateTime"
}
Это должно дать вам необходимую избыточность.
* Я не тестировал это, но он должен вас близко