1

我有一台服务器运行着一个网站,由于某种原因,它随时会死机。不知道为什么,我知道我要描述的这个解决方案只是一种灭火方法,而不是解决问题。但现在没关系。

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

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

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

但问题是,当我启动 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
}

检查网站

4

2 回答 2

0

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

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

请注意,“运行”函数中的任何内容都不会更改 $res,因此它将始终是它开始时的任何值,并且它只会一遍又一遍地继续执行“运行”函数,等待它改变。

于 2013-10-16T22:59:40.600 回答
0

首先:如果这不是用于使用 Powershell 的练习,我同意 Alroc:找到一个免费/开源工具/系统(Nagios 是我在本练习中的首选,因为它可以从 windows 框上的代理执行 Powershell 脚本)。

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

Powershell 没有自己的调度程序,所以大部分时间我使用 Windows 任务调度程序定期执行脚本。

本质上,您需要编写一个可以通过命令行执行来执行的脚本(查找参数以将命令行变量发送到您的脚本),然后设置一个计划任务以按计划执行脚本。警报需要在计划任务或脚本本身中处理(如果您想避免大量误报警报,我建议在脚本本身中处理)。

由于在自动化世界中没有什么是真正“连续的”(即使事件/触发器也有毫秒延迟),您可以将检查的迭代设置为超小(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/

于 2013-10-16T20:02:47.313 回答