Ühes eelmises postituses kirjutasin, et kuna Apache’i veebiserver kipub aeg-ajalt rippuma jääma (kahtlustan, et tegelik kurjam on siinkohal PHP, aga 100% kindlusega ei saa seda väita), siis sai kirjutatud skript, mis iga 15 minuti tagant kontrollib, kas server on püsti ja vajadusel käivitab teenuse uuesti.

Veebiserveri töötamise kontroll peaks iseenesest olema lihtne: tuleb lihtsalt teha telnet porti 80 (või muusse porti, mille peal server töötab). Kui serveriga saadakse ühendus, siis on kõik hästi, vastasel juhul tuleb leida põhjus, miks server ei tööta. Seega oli minu esimene mõte teha telnet ja suunata tulemus töötlemiseks edasi. Kui tulemus sisaldab veateadet, siis tuleks teenus uuesti käivitada. Paraku ei ole kõik asjad elus nii lihtsad ning ma avastasin oma üllatuseks, et Windows’i telnet ei suuda oma väljundit torru (pipe) edasi suunata. Ükskõik, mida ma ka ei teinud, telnet saatis nagu vana ahv oma väljundi ikka konsoolile. Internetiotsingut kasutades selgus, et ma pole esimene, kes selle probleemi otsa komistanud on, aga iseenesest oli see minu jaoks täiesti ootamatu.

Niisiis tuli pöörata pilk mujale. Kuna ma ei viitsinud ise mingis muus keeles põhjalikumat koodi aretama hakata, siis leidsin sobiva jupikese siit ja võtsin selle peaaegu muutmata kujul kasutusele. See pole muidugi ideaalne lahendus, sest erinevalt telnet‘ist tõmbab see terve lehe endale alla, kuid põgusa otsimise käigus ma paremat ei leidnud. Kood ise on selline:

WebSiteTest.vbs

Dim strWebsite

strWebsite = "www.spiderworld.com"

If PingSite( strWebsite ) Then
    WScript.Quit 0
Else
    WScript.Quit 1
End If


Function PingSite( myWebsite )
' This function checks if a website is running by sending an HTTP request.
' If the website is up, the function returns True, otherwise it returns False.
' Argument: myWebsite [string] in "www.domain.tld" format, without the
' "http://" prefix.
'
' Written by Rob van der Woude
' http://www.robvanderwoude.com
    Dim intStatus, objHTTP

    Set objHTTP = CreateObject( "WinHttp.WinHttpRequest.5.1" )

    objHTTP.Open "GET", "http://" & myWebsite & "/", False
    objHTTP.SetRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MyApp 1.0; Windows NT 5.1)"

    On Error Resume Next

    objHTTP.Send
    intStatus = objHTTP.Status

    On Error Goto 0

    If intStatus = 200 Then
        PingSite = True
    Else
        PingSite = False
    End If

    Set objHTTP = Nothing
End Function

Võrreldes originaaliga on selles skriptis muudetud ainult veebiserveri aadress ning teate väljastamise asemel tagastab skript 0, kui server töötab ja 1, kui server ei tööta. Et selle tulemusega midagi peale hakata, sai kirjutatud käsufail, mis ei erinenud kuigivõrd minu esialgsest nägemusest. Viimati tegin midagi sellist küll aastaid tagasi, ent erinevalt telnet‘ist töötas see nii, nagu eeldasin.

testwebsite.bat

@ECHO OFF
wscript.exe WebSiteTest.vbs

IF errorlevel 1 GOTO :error

ECHO Success
GOTO :end

:error
ECHO Error
ECHO Error %date% %time% >>errors.txt
NET STOP Apache2.2
NET START Apache2.2

:end

Kõik katkestused veebiserveri töös, eeldusel, et arvuti ise töötab, logitakse niisiis faili errors.txt. Viimasest IP-aadressi vahetusest saadik on selles järgmised read:

Error N 27.11.2008 14:00:30,70 
Error L 29.11.2008 14:15:30,70 
Error L 06.12.2008 23:30:30,71 
Error E 08.12.2008  2:15:00,58 
Error T 09.12.2008 14:30:30,77 
Error L 13.12.2008  1:00:21,32 
Error L 13.12.2008  1:15:23,73 
Error L 13.12.2008  1:30:23,37 

Nagu näha, kukub server tõesti suvalistel aegadel ise maha. Ühtlasi näeb siit, et eile öösel suutis STV jälle maha saada ligi tunniajase teenusekatkestusega. Puhtalt veebiserveri huvides oleks muidugi võimalik kontrollida www.spiderworld.com asemel localhost‘i töötamist, aga selline skript annab samas hea võimaluse ka teenuse kättesaadavust kontrollida, kuigi Apache’i taaskäivitatakse sel juhul ilmaasjata.

Veidi häiriv on küll see konsooliaken, mis iga 15 minuti tagant hetkeks ekraanile hüppab, kuid seni pole ma leidnud võimalust sellest lahti saada. Vahest peaks mingil hetkel proovima kontrollskripti Powershelli peale üle viia, mis peaks võimaldama seda akent mitte näidata, aga see on tuleviku teema.