我有一个可执行文件,我已将其安排为每五分钟运行一次(使用 Windows 的内置任务计划程序)。运行此可执行文件至关重要,因为它会更新一些时间关键文件。但是,如果运行可执行文件的虚拟服务器发生故障,我该如何应对?每次运行之间的间隔都不应超过 15 分钟。
由于我正在使用 Windows Server 及其任务计划程序,我想知道是否可以创建某种集群来自动处理这种情况?问题是,有问题的服务器在 Windows Azure 上运行,我认为我无法使用虚拟机创建实际的集群。
如果可以使用第三方工具解决问题,那也没问题。稍微概括一下这个问题:如何确保每 5 分钟运行一次可执行文件,即使服务器可能出现故障?
答案1
如果您无法进行集群但您可以在同一个网络上拥有多台机器,那么您可以将可执行文件包装在 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}
将其保存为服务器 1 上的 .PS1 文件,并将计划任务指向“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 [email protected] -from [email protected] -subject "Launched on backup" -body "Executable failed on server1, ran from backup server on $strDateTime"
}
这应该会给你提供一点你需要的冗余。
*我还没有测试过,但应该接近