kontext
Goto Top

Fileage Check mit anschließender Aktion

Guten Morgen Community,
Guten Morgen Script-Schreiber face-smile

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 face-wink

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 face-smile
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 face-smile

Gruß
@kontext

Content-Key: 221967

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

Printed on: April 19, 2024 at 08:04 o'clock

Member: colinardo
colinardo Nov 14, 2013 updated at 09:13:37 (UTC)
Goto Top
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.
$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"  
}
Die Source für das Event-Log musst du ja einmalig anlegen.

Grüße Uwe
Member: kontext
kontext Nov 14, 2013 at 09:01:14 (UTC)
Goto Top
Hi @colinardo,

Die Datei ist wie folgt aufgebaut: JAHR-Monat-Tag.ext -> 2013-11-14.txt
Es gibt zwar noch eine Report-Datei die ein ähnlichen Zeitstempel hat, jedoch hat die eine andere Dateiendung.

Vielen Dank für den Code - werde ich gleich testen.

Gruß
@kontext
Member: colinardo
colinardo Nov 14, 2013 updated at 09:39:31 (UTC)
Goto Top
Zitat von @kontext:
Die Datei ist wie folgt aufgebaut: JAHR-Monat-Tag.ext -> 2013-11-14.txt
dann tauschst du einfach den Dir-Befehl durch diesen aus:
dir "C:\Pfad\????-??-??.txt" 
bzw. exakter geht's in der Powershell auch so:
dir "c:\Pfad\[1-2][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9].txt"
Member: kontext
kontext Nov 14, 2013, updated at Nov 15, 2013 at 06:44:17 (UTC)
Goto Top
Hi @colinardo,

ich habe nun das Script angepasst und wollt es gerade testen.
Nur leider scheitert dies face-smile

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."

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?


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
... und kann man irgendwie noch steuern das PS, wenn ein File existiert, im Eventlog ein Information schreibt - alles passt?

EDIT: habe gerade noch folgenden Fehler bekommen: File *.ps1 cannot be loeaded because the execution of scripts is diasabled on this system.
Also hab ich einen Anhaltspunkt und mach mich mal auf die Fehleranalyse face-smile

EDIT2: Script läuft - hab die Powershell Execution Policy angepasst (schön dass das bei Server 2012 anders gehandhabt wird wie bei 2008 R2)...
... Habe auch einen Eintrag im Eventlog drinnen - super face-smile
... jetzt wäre nur noch schön das bzgl. verschiedenen Levels und was passiert wenn das File vorhanden bzw. aktuell ist face-smile

Gruß
@kontext (der sich nach dem heutigen Tag das Buch Powershell for Dummies bestellt)
Member: colinardo
colinardo Nov 14, 2013 at 10:30:17 (UTC)
Goto Top
Zitat von @kontext:
ich habe nun das Script angepasst und wollt es gerade testen.
Nur leider scheitert dies face-smile

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 !
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?
In dem Beispiel muss die Datei ja mindestens 2 Stunden alt sein, als Referenz wird nicht das Datum im Dateinamen sondern "LastWriteTime" der Datei benutzt. Zum testen kannst du das (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 write-eventlog noch folgenden Parameter mitgeben:
-EntryType Information
Die Entry-Types die möglich sind, sind folgende:
  • 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 face-smile

Grüße Uwe
Member: colinardo
colinardo Nov 14, 2013 updated at 13:33:36 (UTC)
Goto Top
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 anpassen
if ($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:
Member: kontext
kontext Nov 14, 2013 updated at 10:50:08 (UTC)
Goto Top
Zitat von @colinardo:
Klär mich auf face-smile
Hi @colinardo,

klar gerne klär ich dich auf ...
... wenn ich bei meinem Nagios Check einen Check mache - dann muss ich einen Critical Wert angeben ...
... Sprich das ist der Wert der mittels Script ins Eventlog geschrieben wird
... das heißt wenn immer ein Critcal Wert im Eventlog steht - wird auch das Monitoring nicht mehr Grün face-smile
... also brauche ich noch irgend ein Wert der sagt - alles OK (Monitoring muss nicht alarmieren) face-big-smile
... aber dazu lass ich mir was noch einfallen face-smile

Ich hoffe du hast mich nun verstanden - jedoch bin ich ja jetzt schon ein Stück weiter, da das Script ja bereits funktioniert.
Jetzt werde ich mal schauen wie ich es realisiere face-smile

Grüße Uwe
Danke nochmals - Frage gelöst - und bald Mittag face-smile
In diesem Sinne - Gruß
@kontext

EDIT: Danke für die Links ...
... werde mir mal in Ruhe anschauen und dann mal weiterschauen
... PS ist eigentlich ein sehr mächtiges Teil und ich konnte ein / zwei Dinge bereits selbst lösen
... nur das Problem ist, dass das Scripten nicht mein täglich Brot ist - aber zum Glück gibt es ja dann solche PRO's wie dich face-wink
Member: kontext
kontext Nov 14, 2013 updated at 12:32:40 (UTC)
Goto Top
Hallo @colinardo,

kannst du mir vielleicht noch sagen, was an diesem Script nicht passt?
$file = dir "C:\test\????-??-??.txt" | ?{$_.PSIsContainer -eq $false -And $_.LastWriteTime -lt (Get-date).AddHours(-4)} | Sort-Object -Property LastWriteTime -Descending | select -First 1   
if ($file){ 
} else { 
   if ((dir "C:\test\????-??-??.txt").count -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 mehr auf"   
   } 
}

Gruß
@kontext
Member: colinardo
colinardo Nov 14, 2013 updated at 13:35:45 (UTC)
Goto Top
Syntaxmäßig ist es OK, aber ich habe noch immer nicht ganz verstanden wie euer Programm arbeitet, bzw. wann das File existiert oder nicht, bzw ob es auch gelöscht wird ...??
du hast ja gar keine Meldung im ersten IF-Abschnitt ..zwischen Zeile 3 und 4
Member: kontext
kontext Nov 14, 2013 updated at 14:58:47 (UTC)
Goto Top
Das Programm erstellt um Mitternacht ein neues File Jahr-Monat-Tag.txt ...
... solang die Aufzeichnung läuft bzw. kein Fehler auftritt wird dieses File immer aktualisiert

Tritt ein Fehler auf, stoppt die Aufzeichnung (ein PopUp erscheint) und das wars.
Das File Jahr-Monat-Tag.txt wird nicht mehr aktualisiert.

Das Programm selber bietet keine Alarmierung, etc. an - alles sehr rudimentär und wahrscheinlich auch veraltet face-big-smile

Gelöscht wird nichts.
Am Monatsende verschiebt ein Mitarbeiter alle "alten" Files vom Monat in einen Ordner ...
... im Rootverzeichnis ist also immer das Tagesaktuelle File und die restlichen vom Monat

Ziel vom PS-Script sollte folgendes sein:
Script schaut in den Ordner und sieht, dass das File akutell ist - also kann das Script ruhig eine Message ins Eventlog machen - alles OK
Nun schaut das Script in den Ordner und sieht, dass das File nicht mehr aktualisiert wurde - also muss ein Fehler aufgetreten sein und darum sollte ein Eintrag im Eventlog gemacht werden mit Error. Also ich brauche nur die Möglichkeit die 2 Status abzufangen und ins Eventlog einzutragen. (den Rest mit dem Monitoring habe ich bereits konfiguriert)
Unser Monitoring (baut auf Nagios auf) macht einen Eventlog Check und sieht den Error und alarmiert uns per email und / oder SMS ...
... wenn alles OK ist, schlägt auch das Monitoring nicht an.

Hoffe nun hab ich es halbwegs Verständlich rüber gebracht face-big-smile
Bzw. du verstehst mich nun ein wenig besser face-smile

Gruß
@kontext
Member: colinardo
colinardo Nov 14, 2013 updated at 14:02:50 (UTC)
Goto Top
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.
$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
Member: kontext
kontext Nov 14, 2013 updated at 14:06:19 (UTC)
Goto Top
Kein Problem - danke für die Mühe face-smile
Kannst du mir noch kurz erklären, warum du 2mal mit if und else arbeitest?
Vor allem verstehe ich nicht warum ich die Zeile 12 brauche face-big-smile

EDIT: also das File selber wird alle Minute aktualisiert (Date modified ist immer aktuell) ...
... ob das Programm das File selber offen hat müsste ich mit ProcMon analysieren

Gruß
@kontext
Member: colinardo
colinardo Nov 14, 2013 updated at 14:14:23 (UTC)
Goto Top
In $file steht ja nur eine Datei wenn diese aktuell ist, und älter als 4 Stunden ist. --> Fehler
Nun ist es aber so das wenn $file LEER ist noch überprüft werden muss ob überhaupt eine aktuelle Datei von Heute existiert, ist dies der Fall ist alles OK, ansonsten, Fehler.

Grüße Uwe
Member: kontext
kontext Nov 14, 2013 updated at 14:17:11 (UTC)
Goto Top
Zitat von @colinardo:
In $file steht ja nur eine Datei wenn diese aktuell ist, und älter als 4 Stunden ist. --> Fehler
Nein - wenn $file älter als 4 Stunden ist --> Fehler
Wenn $file aktuell ist --> OK
Wenn kein File von heute existiert --> Fehler

Ich habe nun das Script angepasst (Pfad) und getestet.
Nun bekomme ich nur Fehler ins Eventlog - obwohl ein aktuelles File vorhanden ist face-smile

Grüße Uwe
Gruß
@kontext
Member: colinardo
colinardo Nov 14, 2013 at 14:19:11 (UTC)
Goto Top
mit "aktuell" meinte ich das Datum im Dateinamen...
Member: kontext
kontext Nov 14, 2013 updated at 14:26:30 (UTC)
Goto Top
Zitat von @colinardo:
mit "aktuell" meinte ich das Datum im Dateinamen...
alles klar - sry face-smile

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.

Gruß
Member: colinardo
colinardo Nov 14, 2013 at 14:38:35 (UTC)
Goto Top
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 ...
Member: kontext
kontext Nov 14, 2013 at 14:42:18 (UTC)
Goto Top
Zitat von @colinardo:
sorry bin gerade ziemlich im Stress, das unterlaufen einem doch einige Flüchtigkeitsfehler, melde mich gleich nochmal ...
@colinardo, kein Stress - lass dir Zeit.
Und wenn es erst morgen ist, ist es auch kein Problem face-smile

Gib dir mal einen virtuellen Kaffee aus face-wink

Gruß
@kontext
Member: colinardo
Solution colinardo Nov 14, 2013, updated at Dec 05, 2013 at 13:22:30 (UTC)
Goto Top
Zitat von @kontext:
Gib dir mal einen virtuellen Kaffee aus face-wink
Der hat gewirkt =8--)
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"  
}
Member: kontext
kontext Nov 14, 2013 at 14:58:24 (UTC)
Goto Top
Zitat von @colinardo:
> Zitat von @kontext:
> Gib dir mal einen virtuellen Kaffee aus face-wink
Der hat gewirkt =8--)
Freut mich ...
... hab nun mal das Script angeworfen und scheint zu passen - alles OK face-smile
... wenn die Datei nicht vorhanden ist kommt Datei nicht vorhanden (sehr schön) face-big-smile
... jetzt muss ich nur noch ein paar Stunden warten und dann kann ich vll. so auch noch einen Test machen face-big-smile

Danke nochmals face-smile
Gruß
@kontext