2013-10-16 52 views
1

我有一个服务器运行一个网站,由于某种原因,只要感觉就像死了一样。不知道为什么,我知道我将要描述的这个解决方案只是一种放火而不解决问题的方法。但现在没关系。连续检查网站是否可用与Powershell

所以,我想在服务器上运行一个Powershellscript,它连续检查网站是否可用,并基于该网站执行一些魔法让它再次运行。

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

当我打开Apache并运行脚本时,“运行”功能正在工作。 当我关闭Apache并运行脚本时,函数“notrunning”正在工作。

但问题是,当我启动Apache,运行脚本和“运行”是连续循环,我打开了Apache(脚本仍在运行),我希望它继续“不运行”,解决问题,再次启动我的服务,并从一开始就检查网站是否启动并转到“运行”。但它卡在“跑步”上,不会变成“不跑”。

任何想法我可以做到这一点?

(我编辑的脚本拿出实际过程和服务名称为我公司的缘故)

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

+1

有些工具可以获得(有些甚至是免费/开放源代码,[其他](http://www.paessler.com/network_monitoring/website_monitoring)有可能需要升级到的付费版本)一个网站为您触发警报或在没有回应时采取其他行动。为什么重新发明轮子? – alroc

+1

我刚开始学习Powershell,认为创建一些有用的东西会很有趣:) – Frigol33t

+1

规则1:不要创建某人已经写过的东西(并且不提供/低成本),除非它纯粹是一种教育练习。他们可能做得更好 - 这在商业环境中可能变得很重要。 – alroc

回答

0

第一:如果这是在使用PowerShell比练习其他任何东西,我同意Alroc:找到一个免费/开源的工具/系统(Nagios是我的首选,因为它可以在Windows系统上从代理执行Powershell脚本)。

但是,如果您打算将Powershell用作练习,请尝试Powershell ScheduledJob模块cmdlet,该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/

0

从th只是作为一个实践锻炼,你的死循环是由这一行造成的:

而($ res.StatusCode -ge“200”){}运行notrunning状态

注意:并没有在“运行”功能改变$ res,所以它始终是它开始的任何值,并且它会一直重复执行'running'函数,等待它改变。

+0

但我希望它启动函数checkSite,并查看页面是否启动,采取行动基于(运行/ notrunning),并在那之后开始一个新的checkSite。我不想运行/不运行来改变$ res。我想让脚本做一个新的检查,例如“好吧,5分钟前还没上来,现在怎么样?我会再检查一下,好吧,现在它已经到了” – Frigol33t