georg2204
Goto Top

Watchdog - Datei auf Änderungen überwachen mit Batch

Hallo,

ich habe ein Programm, welches in kurzen Abständen immer wieder über COM1 Daten abfragt und diese speichert / weiter verarbeitet.

Manchmal kommt es jedoch vor, dass etwas mit dem Zugriff nicht klappt und die Anwendung abstürzt, da keine Kommunikation hergestellt werden kann.
Man sieht das dann nur, wenn keine Meldungen mehr kommen und dann muss der Rechner oder die Anwendung neu gestartet werden.

Nun möchte ich über Batch oder Powershell einfach die Logdatei der Anwendung überwachen und bei längerer Inaktivität den PC neu starten.

Beispiel:

Dateiänderungsdatum länger als 30 Minuten
Schreibe in Logfile "Watchdog aktiv - Neustart wird ausgeführt"
Neustart

Da ich schon ein Batch Programm habe, welches auf vorhandene Meldungen von dem zu überwachenden Programm prüft und diese weiter verarbeitet, wäre es ganz praktisch hier die Abfrage mit einzubauen.

Habt ihr eine Idee, wie man sowas abfragt? Ich komme leider nicht mehr weiter.

Danke und Gruß,
Georg

Content-Key: 377000

Url: https://administrator.de/contentid/377000

Ausgedruckt am: 19.03.2024 um 06:03 Uhr

Mitglied: colinardo
Lösung colinardo 14.06.2018 aktualisiert um 17:02:27 Uhr
Goto Top
Hallo Georg,
das lässt sich ziemlich schnell mit einem FileSystemWatcher erledigen. Dazu gibt es hier von mir und anderen schon diverse Threads dazu wenn man ein Logfile überwachen möchte.
Siehe

Einfaches Beispiel mit Powershell das ein Logfile permanent überwacht und nach einer gewissen Zeit ohne Änderung eine Aktion ausführt
# Datei deren Inhalt überwacht werden soll
$file = 'D:\Daten\logfile.txt'  
# Max Zeit ohne Änderungen in Sekunden
$global:maxtime = 1800
# ---------
# Zeit der letzten Änderung
$global:lastchange = get-date
# Eventuell existierenden Event subscriber löschen
Get-EventSubscriber FileChanged -EA SilentlyContinue | Unregister-Event -Force
# Filesystemwatcher erstellen
$fsw = New-Object IO.FileSystemWatcher (Split-Path $file -Parent), (Split-Path $file -Leaf) -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}   
# Filesystemwatcher registieren
Register-ObjectEvent $fsw Changed -SourceIdentifier FileChanged -Action {
    # Pfad zur Datei
    $fullpath = $Event.SourceEventArgs.FullPath
    $global:lastchange = $Event.TimeGenerated
} | out-null

cls
write-host "Überwache Datei '$file' ..." -F Green  
while($true){
    if ((get-date) -gt $global:lastchange.AddSeconds($global:maxtime)){
        write-host "Letzte Änderung an der Datei liegt länger als $global:maxtime Sekunden zurück." -F Yellow  
        # Tu hier was
        # z.B. Prozess neu starten oder Rechner neu starten
        # Restart-Computer -Force
        break
    }
    sleep 1
}
Es gibt aber auch die Möglichkeit über Win32_Process und der Responding Methode abzufragen ob ein Prozess noch auf Anfragen reagiert, das wäre aber dann erst einmal zu prüfen wie die Anwendung hier reagiert. Ausschnitt dafür (Powershell)
if (!(Get-Process -Name  "AnwendungXYZ").Responding) {  
     write-host "Prozess reagiert nicht auf Anfragen"  
}
All das kannst du problemlos auch in deine Batch einbauen. Wie das geht steht auch hier zur Genüge im Forum. Unsere Suchmaschine liefert dir die passenden Ergebnisse dazu.

Grüße Uwe
Mitglied: georg2204
georg2204 14.06.2018 um 19:25:47 Uhr
Goto Top
Danke Uwe! Hatte dies so leider nicht gefunden. Läuft perfekt,

Gruß Georg