Fileage Check mit anschließender Aktion
Guten Morgen Community,
Guten Morgen Script-Schreiber
Ich hab ein kleines Problem und sehe mal wieder den Wald vor lauter Bäumen nicht.
Vorneweg - ich weiß, mein Problem wurde bereits in ähnlicher Art und Weise ein paar Mal hier bearbeitet ...
... hab die SUFU bemüht (wie es sich als Administrator.de User sich gehört) - leider nichts passendes gefunden
Folgende Situation:
Gewünscht ist ein Monitoring des Programmes - damit falls die Aufzeichnung gestoppt wurde, sie von Hand wieder gestartet werden kann.
Monitoring ist bereits im Einsatz - baut auf Nagios auf ...
Problem:
Nun wollte ich einfach eine Quick & Dirty Lösung realisieren, die mir einen File-Age-check ausführt.
Da habe ich ebenfalls wieder 2 Wege, die ich Beschreiten könnte ...
Weg1 ist jetzt für den Anfang IMHO ein wenig Oversized bzw. braucht zu viel Zeit für die Implementierung / Fehleranylse, etc.
Daher wollte ich den Weg2 Beschreiten - und nun Häng ich hier und komme nicht weiter...
Ich wollte eine File-Check-Abfrage schreiben (Powershell, Batch, VBS ist hier egal) und wenn das File älter als XY Stunden ist, soll eine Meldung ins Eventlog geschrieben werden - mittels Monitoring würde ich dann das Eventlog abgreifen und viola - wir würden informiert werden
So und nun zum eigentlichen Problem - ich schaffe es nicht einen brauchbaren File-Age-Check zu machen ...
... arbeite ich mit forfiles listet er mir alle Files auf - auch die "archivierten" in den Unterordner
... mit VBS und Powershell komme ich ca. auf das gleiche Ergebnis - wenn ich es mal schaffe, werden alle Files statt nur einem angezeigt
Bzgl. Eventlog sehe ich eigentlich keine Probleme denn das kann ja per Powershell Befehl oder per eventcreate realisiert werden.
Ich hoffe ihr habt mich verstanden, wenn nicht bitte Fragen, und ihr könnt mir helfen bzw. mir die richtige Richtung weisen
Gruß
@kontext
Guten Morgen Script-Schreiber
Ich hab ein kleines Problem und sehe mal wieder den Wald vor lauter Bäumen nicht.
Vorneweg - ich weiß, mein Problem wurde bereits in ähnlicher Art und Weise ein paar Mal hier bearbeitet ...
... hab die SUFU bemüht (wie es sich als Administrator.de User sich gehört) - leider nichts passendes gefunden
Folgende Situation:
- Software zur Aufzeichnung und zur Anzeige von Produktionsdaten läuft auf einem Server 2008 R2.
- Die Software bzw. das Fenster muss geöffnet sein, damit die Software aufzeichnet.
- Es wird immer um Mitternacht ein eigenes Tagesaktuelles File erstellt.
Gewünscht ist ein Monitoring des Programmes - damit falls die Aufzeichnung gestoppt wurde, sie von Hand wieder gestartet werden kann.
Monitoring ist bereits im Einsatz - baut auf Nagios auf ...
Problem:
- Wenn es zu einem TimeOut der IP-Schnittstelle kommt oder diese abgeschaltet wird, läuft die Software auf einen Fehler.
- Es erscheint zwar ein PopUp - jedoch hat dieses PopUp keinen eigenen Prozess - d.h. ich kann keinen Prozess Check machen
- Ebenfalls schreibt die Software keine Meldung ins Eventlog - also auch kein Eventlog-Check
- Im Zielverzeichnis ist immer eine aktuelle Datei YYYY-MM-DD - dadurch das sich der Name immer ändert ist auch kein reiner File Check möglich
- Den Nagios Check - check file age in folder, habe ich versucht zu implementieren - leider ohne Erfolg - check will nicht, wie ich will
Nun wollte ich einfach eine Quick & Dirty Lösung realisieren, die mir einen File-Age-check ausführt.
Da habe ich ebenfalls wieder 2 Wege, die ich Beschreiten könnte ...
- Weg1: Remote Check vom Monitoring alle XY Stunden
- Weg2: Windows eigener Check mittels Geplantem Task
Weg1 ist jetzt für den Anfang IMHO ein wenig Oversized bzw. braucht zu viel Zeit für die Implementierung / Fehleranylse, etc.
Daher wollte ich den Weg2 Beschreiten - und nun Häng ich hier und komme nicht weiter...
Ich wollte eine File-Check-Abfrage schreiben (Powershell, Batch, VBS ist hier egal) und wenn das File älter als XY Stunden ist, soll eine Meldung ins Eventlog geschrieben werden - mittels Monitoring würde ich dann das Eventlog abgreifen und viola - wir würden informiert werden
So und nun zum eigentlichen Problem - ich schaffe es nicht einen brauchbaren File-Age-Check zu machen ...
... arbeite ich mit forfiles listet er mir alle Files auf - auch die "archivierten" in den Unterordner
... mit VBS und Powershell komme ich ca. auf das gleiche Ergebnis - wenn ich es mal schaffe, werden alle Files statt nur einem angezeigt
Bzgl. Eventlog sehe ich eigentlich keine Probleme denn das kann ja per Powershell Befehl oder per eventcreate realisiert werden.
Ich hoffe ihr habt mich verstanden, wenn nicht bitte Fragen, und ihr könnt mir helfen bzw. mir die richtige Richtung weisen
Gruß
@kontext
Please also mark the comments that contributed to the solution of the article
Content-ID: 221967
Url: https://administrator.de/contentid/221967
Printed on: September 18, 2024 at 22:09 o'clock
20 Comments
Latest comment
Hallo kontext,
welcher Teil der Datei bleibt den immer gleich bzw. wie ist das File benannt bzw. welche Erweiterung hat dieses? Ist die Datei immer die aktuellste im Ordner ?
Beispiel: Wenn deine Datei z.B. die Endung "*.csv" hat und immer die aktuellste CSV-Datei im Ordner ist und wenn diese Datei im Beispiel älter als 2 Stunden ist kannst du das File folgendermaßen ermitteln.
Die Source für das Event-Log musst du ja einmalig anlegen.
Grüße Uwe
welcher Teil der Datei bleibt den immer gleich bzw. wie ist das File benannt bzw. welche Erweiterung hat dieses? Ist die Datei immer die aktuellste im Ordner ?
Beispiel: Wenn deine Datei z.B. die Endung "*.csv" hat und immer die aktuellste CSV-Datei im Ordner ist und wenn diese Datei im Beispiel älter als 2 Stunden ist kannst du das File folgendermaßen ermitteln.
$file = dir "C:\Pfad\????-??-??.txt" | ?{$_.PSIsContainer -eq $false -And $_.LastWriteTime -lt (Get-date).AddHours(-2)} | Sort-Object -Property LastWriteTime -Descending | select -First 1
if ($file){
# Zum Erstellen der neuen Eventlog-Quelle muss diese einmalig mit folgendem Befehl angelegt werden
# New-EventLog -Source "MyTest" -LogName Application
Write-EventLog -LogName Application -Source "MyTest" -EventId 9999 -Message "Programm hat sich aufgehängt"
}
Grüße Uwe
dann tauschst du einfach den Dir-Befehl durch diesen aus:
bzw. exakter geht's in der Powershell auch so:
dir "C:\Pfad\????-??-??.txt"
dir "c:\Pfad\[1-2][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9].txt"
Zitat von @kontext:
ich habe nun das Script angepasst und wollt es gerade testen.
Nur leider scheitert dies
Zuerst habe ich die Source angelegt. Die Source wurde auch registriert / angelegt.
Wenn ich den Befehl erneut ausführe bekomme ich die Meldung "The source is already registered on the
"localhost" Computer."
Darf ja auch nur einmal angelegt werden, also nicht mit ins Script übernehmen !ich habe nun das Script angepasst und wollt es gerade testen.
Nur leider scheitert dies
Zuerst habe ich die Source angelegt. Die Source wurde auch registriert / angelegt.
Wenn ich den Befehl erneut ausführe bekomme ich die Meldung "The source is already registered on the
"localhost" Computer."
Einmal angelegt ist sie permanent auch nach einem Neustart.
Jetzt habe ich ein Testfile (2011-11-14.txt - Date Modified ist der 13.11) in das Zielverzeichnis kopiert mit gestrigem Datum.
Wenn ich nun das Script oben ausführe passiert nichts - Powershell öffnet und schließt sich ...
... geht das Script nur auf die letzte / jüngeste Datei und falls ja - kann ich das PS Script irgendwie testen?
(Get-date).AddHours(-2)
in (Get-date).AddMinutes(-1)
ändern so brauchst du nicht 2 Stunden warten, oder du nimmst ein File das bereits älter als 2 Stunden ist.Mach den Test z.B. mit der Powershell ISE.
Das Script liefert immer nur die neueste Datei zurück, falls mehrere im Format YYYY-MM-DD.txt existieren.
Ach ja - noch eine andere Frage - kann man dem Script auch sagen was für eine Art des Eventlog er machen soll ...
... also WARNUNG / CRITICAL / INFORMATION
kannst du selbst verständlich, einfach dem Befehl ... also WARNUNG / CRITICAL / INFORMATION
write-eventlog
noch folgenden Parameter mitgeben:-EntryType Information
- Information
- Warning
- Error
- SuccessAudit
- FailureAudit
... und kann man irgendwie noch steuern das PS, wenn ein File existiert, im Eventlog ein Information schreibt - alles passt?
klar, aber bin jetzt ein wenig verwirrt was du jetzt genau willst.Im obigen Script wird ja der IF-Teil nur ausgeführt wenn in $file eine Datei zurückgegeben wird die den Kriterien entspricht:
- "LastWriteTime" älter als 2 Stunden
- wenn mehrere Dateien im selben Dateinamenformat existieren nehme nur die neueste davon
Klär mich auf
Grüße Uwe
jetzt wäre nur noch schön das bzgl. verschiedenen Levels und was passiert wenn das File vorhanden bzw. aktuell ist
einfach den IF-Teil anpassenif ($file){
# Write ins Eventlog mit Fehlermeldung (Programm hängt)
} else {
if ((dir "c:\Pfad\????-??-??.txt").count -gt 0){
# Write ins Eventlog mit Erfolgsmeldung
} else {
# Write ins Eventlog mit Fehlermeldung das keine solche Datei existiert
}
}
kontext (der sich nach dem heutigen Tag das Buch Powershell for Dummies bestellt)
Gut für die Grundlagen und Praxisvermittlung:Weitere:
Yip das war klar ! Merci.
Darauf sollte das hier funktionieren. In Zeile 2 den Pfad anpassen, aber die Variable $date nicht rauslöschen.
Hinweis du kannst die EventID anpassen, die muss nicht unbedingt 9999 lauten, so kannst du mit Nagios den Fehler differenzierter auswerten.
Noch ne Frage, hat das Programm die Textdatei während der Aufzeichnung die ganze Zeit in einem Filehandle geöffnet ? Beobachte das File mal ob sich das "Geändert"-Datum während der Aufzeichnung überhaupt ändert, denn normalerweise wird das "Geändert" erst aktualisiert wenn das File-Handle vom Programm geschlossen wurde.
Grüße Uwe
Darauf sollte das hier funktionieren. In Zeile 2 den Pfad anpassen, aber die Variable $date nicht rauslöschen.
Hinweis du kannst die EventID anpassen, die muss nicht unbedingt 9999 lauten, so kannst du mit Nagios den Fehler differenzierter auswerten.
$date = get-date -Format "yyyy-MM-dd"
$filepath = "C:\test\$date.txt"
$filecount = (dir $filepath).count
$file = dir $filepath | ?{$_.PSIsContainer -eq $false -And $_.LastWriteTime -lt (Get-date).AddHours(-4)} | Sort-Object -Property LastWriteTime -Descending | select -First 1
if ($file){
Write-EventLog -LogName Application -Source "MeinProgramm" -EntryType Error -EventId 9999 -Message "Programm zeichnet nicht mehr auf/ bzw. ist abgestürzt"
} else {
if ($filecount -gt 0){
Write-EventLog -LogName Application -Source "MeinProgramm" -EventId 9999 -Message "Alles OK - Aufzeichnung läuft"
} else {
Write-EventLog -LogName Application -Source "MeinProgramm" -EntryType Error -EventId 9999 -Message "Programm zeichnet nicht auf."
}
}
Noch ne Frage, hat das Programm die Textdatei während der Aufzeichnung die ganze Zeit in einem Filehandle geöffnet ? Beobachte das File mal ob sich das "Geändert"-Datum während der Aufzeichnung überhaupt ändert, denn normalerweise wird das "Geändert" erst aktualisiert wenn das File-Handle vom Programm geschlossen wurde.
Grüße Uwe
Zitat von @kontext:
also folgender Stand - Script läuft - schreibt aber immer Error aus Zeile 12 (obwohl die aktuelle Datei vorhanden ist)
Wenn ich das TXT File verschiebe und das Script läuft kommt eine Fehlermeldung im Powershell das die Datei nicht existiert -
im Eventlog steht Zeile 12.
sorry bin gerade ziemlich im Stress, das unterlaufen einem doch einige Flüchtigkeitsfehler, melde mich gleich nochmal ...also folgender Stand - Script läuft - schreibt aber immer Error aus Zeile 12 (obwohl die aktuelle Datei vorhanden ist)
Wenn ich das TXT File verschiebe und das Script läuft kommt eine Fehlermeldung im Powershell das die Datei nicht existiert -
im Eventlog steht Zeile 12.
Der hat gewirkt =8--)
Habs nochmal umgeschrieben, das geht jetzt auf jeden Fall ...
Habs nochmal umgeschrieben, das geht jetzt auf jeden Fall ...
$date = get-date -Format "yyyy-MM-dd"
$filepath = "C:\temp\$date.txt"
$filecount = (dir $filepath -ErrorAction SilentlyContinue).length
if ($filecount -gt 0){
$file = dir $filepath | ?{$_.PSIsContainer -eq $false -And $_.LastWriteTime -lt (Get-date).AddHours(-4)}
if ($file){
echo "Fehler Programm zeichnet nicht mehr auf"
Write-EventLog -LogName Application -Source "MeinProgramm" -EntryType Error -EventId 9999 -Message "Programm zeichnet nicht mehr auf/ bzw. ist abgestürzt"
} else {
echo "Alles OK"
Write-EventLog -LogName Application -Source "MeinProgramm" -EventId 9999 -Message "Alles OK - Aufzeichnung läuft"
}
} else {
echo "Datei nicht vorhanden"
Write-EventLog -LogName Application -Source "MeinProgramm" -EntryType Error -EventId 9999 -Message "Datei ist nicht vorhanden"
}