不断检查Powershell是否有网站

时间:2013-10-16 14:27:21

标签: powershell

我有一台服务器运行一个网站,出于某种原因,只要感觉它就会掉线。不知道为什么,我知道我要描述的这个解决方案只是一种扑灭火灾而不是解决问题的方法。但现在还可以。

所以,我想在服务器上运行一个Powershellscript,它可以持续检查网站是否可用,并且基于这样做可以让它再次运行。

到目前为止,我有这段代码。

当我打开Apache并运行脚本时,“running”功能正常运行。 当我关闭Apache并运行脚本时,“notrunning”功能正在运行。

但问题是,当我启动Apache时,运行脚本并且“运行”是连续循环的,我转向Apache(脚本仍在运行)我希望它继续“notrunning”,修复问题,再次启动我的服务并从头开始检查网站是否已启动并进入“正在运行”状态。但它会陷入“跑步”而不会变成“不运行”。

我知道如何才能实现这一目标吗?

(我编辑了脚本以取出公司的真实流程和服务名称)

function checkSite
{
[string] $url = 'http://websitegoeshere.com'
[net.httpWebRequest] $req = [net.webRequest]::create($url)
$req.Method = "HEAD"
[net.httpWebResponse] $res = $req.getResponse()
while ($res.StatusCode -ge "200") {running} notrunning
}

function running
{
cls;
Write-Host "  -=IS-checker=-" -fore yellow
Write-Host "" -fore green
Write-Host "----------------------" -fore green
Write-Host " Access to web = OK " -fore green
Write-Host "----------------------" -fore green
sleep 60
}
function notrunning
{
cls;
Write-Host "-=IS-checker=-" -fore yellow
Write-Host "" -fore red
Write-Host "-------------------------" -fore red
Write-Host "  Site down - Site Down  " -fore red
Write-Host "-------------------------" -fore red
sleep 2
$process = "process-name-goes-here"
Write-Host "Stopping process" $process -fore red 
Stop-Process -processname $process
sleep 5
$service = "service-name-goes-here"
Write-Host "Killing service" $service -fore red
Stop-Service $service -Force
sleep 5
Write-Host "Starting service" $service -fore green
Start-Service $service
sleep 5
$LogTime = Get-Date -Format "yyyy-MM-dd hh-mm-ss"
$LogFile = 'C:\PSLog\'+"LOG_"+$LogTime+".log"
$LogTime+" Stopped "+$process+", Stopped "+$service+", Started "+$service | Out-File $LogFile
Write-Host "Logfile written to"$LogFile -fore green
sleep 5
checkSite
}

checkSite

2 个答案:

答案 0 :(得分:0)

首先:如果这是用于使用Powershell的练习以外的任何内容,我同意Alroc:找到一个免费/开源工具/系统(Nagios是我的首选练习,因为它可以从代理执行Powershell脚本一个窗户盒)。

但是,如果您打算将Powershell用作练习,请尝试使用Powershell ScheduledJob模块cmdlet,它可用于从Powershell脚本中控制任务计划程序。

Powershell没有自己的调度程序,因此大多数时候我使用Windows任务计划程序定期执行脚本。

基本上,您需要编写一个可以使用命令行执行执行的脚本(查找Param以将命令行变量发送到您的脚本),然后设置计划任务以按计划执行脚本。警报需要在计划任务中或在脚本本身内处理(如果你想避免TON的误报警,我建议在脚本本身内)。

由于自动化世界中没有任何真正的“连续”(即使事件/触发器具有ms延迟),您可以将检查的迭代设置为超小(1分钟);然而,对于网站正常运行时间检查,每隔5分钟(通常)被认为非常频繁(通常10-30分钟,具体取决于网站的关键性)。玩弄HTTP

以下是关于如何使用Powershell ScheduledJob模块cmdlet的一个很好的说法。 由于您已经具有执行所需任务的功能,因此将它们包装到作业中应该非常容易。

http://blogs.technet.com/b/heyscriptingguy/archive/2012/09/18/create-a-powershell-scheduled-job.aspx

以下是使用Powershell进行网站监控的其他一些来源: http://blogs.technet.com/b/otto/archive/2007/08/23/quick-and-dirty-web-site-monitoring-with-powershell.aspx

http://dmitrysotnikov.wordpress.com/2008/05/29/monitor-web-site-availability/

如果您想进入更加详细和创造性的方法来自动化网站测试(除了200 /可用的测试),请查看Autobrowse Powershell模块:http://autobrowse.start-automating.com/

答案 1 :(得分:0)

从这个练习练习的角度来看,你的无限循环是由这一行引起的:

while($ res.StatusCode -ge“200”){running} notrunning

请注意,'running'函数中的任何内容都不会更改$ res,因此它始终是它开始的任何值,并且它将一遍又一遍地执行'running'函数,等待它更改。