Wie sich nun nach einem längeren Dauer-Reboot-Test herausstellte funktionieren auch die obigen 2 Massnahmen leider nur teilweise.
D.h. der Webseiten-Zugriff klappte auch nicht zu 100% nach jedem Reboot...
Ich habe also einen komplett anderen Ansatz versucht,
der nun auch endlich zu funktionieren scheint...
(mittlerweile > 20 Reboots und es geht noch nach jedem...)
Ich habe mittels
AUTOHOTKEY (download siehe
http://www.autohotkey.com) ein kleines Programm geschrieben
(Quellcode siehe unten)
und mit dem mitgelieferten Compiler zur .EXE compiliert.
1)
Eure Anpassungen im Quellcode wären die folgenden 2 Zeilen...
a) URL = http://
deineURL.de/online.txt
entsprechend durch die gewünschte URL ersetzen
b) settimer, ApacheOk,
60000
Den Verzögerungsintervall bis zur nächsten Prüfung einstellen
(Die Zeit ist in Millisekunden)
Das ganze dann abspeichern als AHK-Datei (z.b. "apachecheck.ahk")
compilieren, fertig ist die .EXE
Hier der Sourcecode zum AUTOHOTKEY-Script.
- Code: Select all
#Persistent
AutoTrim Off
URL = http://deineURL.de/online.txt
settimer, ApacheOk, 60000
return
;-------------------------------------------------------------------------------------------------
ApacheOK:
xxx = % Crypt()
UrlDownloadToFile,*0 %URL%?fakeParam=%xxx%, NUL
if errorlevel
{
CMDret_RunReturn("cmd /c net stop Apache2")
CMDret_RunReturn("cmd /c net start Apache2")
}
return
;-------------------------------------------------------------------------------------------------
crypt(l=65)
{
pass =
chPool = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!"£$`%^&*()_-=+{}[]`;:``@'#~<>,./?\|¬¦
StringSplit, list, chPool
Loop, % l
{
Random, rnd, 1, % list0
i := list%rnd%
pass = %pass%%i%
}
Return, pass
}
;-------------------------------------------------------------------------------------------------
CMDret_RunReturn(CMDin)
{
Global cmdretPID ; for external abort
dly := (A_BatchLines <> -1) * 50 ; needs longer delay when Batchlines <> -1
VarSetCapacity(lpBuffer,1024)
VarSetCapacity(sui,68, 0)
VarSetCapacity(pi, 16, 0)
VarSetCapacity(pa, 12, 0)
InsertInteger( 12, pa, 0)
InsertInteger( 1, pa, 8)
IF (DllCall("CreatePipe", "UInt*",hRead, "UInt*",hWrite, UInt,&pa, Int,0) <> 0) {
InsertInteger(68, sui, 0 )
DllCall("GetStartupInfo", "UInt", &sui)
InsertInteger(0x101, sui, 44)
InsertInteger(0, sui, 48)
InsertInteger(hWrite,sui, 60)
InsertInteger(hWrite,sui, 64)
IF (DllCall("CreateProcess",Int,0,Str,CMDin,Int,0,Int,0,Int,1,UInt,0,Int,0,Int,0,UInt,&sui,UInt,&pi)<>0) {
cmdretPID := ExtractUInt(pi, 8)
Loop {
IF DllCall("PeekNamedPipe",uint,hRead, uint,0, uint,0, uint,0, "UInt*",bSize, uint,0) = 0
break
Process Exist, %cmdretPID%
If (ErrorLevel = 0 and bsize = 0)
break
If (bsize = 0) {
Sleep %dly% ; only sleep before early continue
Continue
}
VarSetCapacity(lpBuffer, bSize, 0)
IF (DllCall("ReadFile",UInt,hRead, Str,lpBuffer, Int,bSize, "UInt*",bRead, Int,0) > 0) {
IFEqual bRead,0, Continue
CMDout = %CMDout%%lpBuffer%
}
} ; Loop
cmdretPID =
} ; IF CreateProcess
DllCall("CloseHandle", UInt, hWrite)
DllCall("CloseHandle", UInt, hRead)
} ; IF CreatePipe
Return CMDout
}
;-------------------------------------------------------------------------------------------------
InsertInteger(pInteger, ByRef pDest, pOffset = 0, pSize = 4) {
Loop %pSize%
DllCall("RtlFillMemory", UInt,&pDest+pOffset+A_Index-1, UInt,1, UChar,pInteger >> 8*A_Index-8)
}
;-------------------------------------------------------------------------------------------------
ExtractUInt(ByRef pSource, pOffset = 0, pSize = 4) {
Loop %pSize%
result += *(&pSource+pOffset+A_Index-1) << 8*A_Index-8
Return result
}
;-------------------------------------------------------------------------------------------------
2)
Im Root des Webservers (\htdocs\) eine 0-Byte grosse Textdatei namens "online.txt" anlegen.
(0 Bytes, damit kein unnötiger Traffic erzeugt wird)
3)
Auf eurerm Webserver mittels "Geplante Tasks" eine neue Task anlegen und die compilierte .EXE Datei auswählen.
- Task ausführen "Beim Systemstart"
- Ausführen als Systemadministrator (User + Pass eingeben !!!)
- Haken bei "Task beenden nach" rausnehmen, falls gesetzt
Das kleine Programm checkt dann im jeweils eingestellten Intervall im Hintergrund ob der Webserver korrekt erreichbar ist, indem es eine 0-Byte-Dummydatei downloaded und schaut ob das auch gelingt.
Dabei wird der Cache des Browsers umgangen indem 65-stellige quasi einmalige Fakeparameter beim Datei-Download anhängt werden.
Ist die Dummy-Datei nicht downloadbar, so wird der Apache-Dienst komplett neugestartet (STOP/START)
Zugegeben , die ganze Methode ist ein wenig ungewöhnlich,
aber ist bisher die einzige die mein Erreichbarkeitsproblem nun zu 100% gelöst hat.
Wenn jemand eine bessere oder andere Idee hat,
so kann Er/Sie sich jederzeit bei mir melden...