Zeitstempel von Dateien überprüfen bzw. vergleichen und melden
Hallo Zusammen,
Kurze Vorgeschichte:
Wir haben mehrere Hotfolder, bei denen automatisch Dokumente rausgezogen werden und automatisch archiviert + durchsuchbar gemacht werden. Nun ist schon einige male passiert, dass der Dienst die Dateien nicht mehr verarbeitet hat, obwohl der Dienst noch lief. Deswegen können wir auch keine Dienst Überwachung nutzen.
Nun zu meiner Frage, gibt es die Möglichkeit bzw. hat jemand schon eine Lösung, wie ich meine ganzen Dateien überwachen kann mit dem erstellten Zeitstempel der Dokumente.
Bedeutet ich überwache den erstellten Zeitstempel und vergleiche ihn mit der aktuellen Systemzeit, wenn die Differenz größer als 10 min sein sollte, sende mir eine Nachricht per Mail oder anderen Wegen.
Ich wäre für jede Idee offen, seien es Programme oder Batch Skripte, ich habe bei meiner Internet Recherche kein Erfolg gehabt.
Auch meine verzweifelten selbstversuchen, ein solches Batch zu entwerfen sind leider nicht Erfolg gekrönt.
Ich danke euch für euer Feedback!
Ich hoffe irgendjemand kann mir weiterhelfen
Grüße
Kurze Vorgeschichte:
Wir haben mehrere Hotfolder, bei denen automatisch Dokumente rausgezogen werden und automatisch archiviert + durchsuchbar gemacht werden. Nun ist schon einige male passiert, dass der Dienst die Dateien nicht mehr verarbeitet hat, obwohl der Dienst noch lief. Deswegen können wir auch keine Dienst Überwachung nutzen.
Nun zu meiner Frage, gibt es die Möglichkeit bzw. hat jemand schon eine Lösung, wie ich meine ganzen Dateien überwachen kann mit dem erstellten Zeitstempel der Dokumente.
Bedeutet ich überwache den erstellten Zeitstempel und vergleiche ihn mit der aktuellen Systemzeit, wenn die Differenz größer als 10 min sein sollte, sende mir eine Nachricht per Mail oder anderen Wegen.
Ich wäre für jede Idee offen, seien es Programme oder Batch Skripte, ich habe bei meiner Internet Recherche kein Erfolg gehabt.
Auch meine verzweifelten selbstversuchen, ein solches Batch zu entwerfen sind leider nicht Erfolg gekrönt.
Ich danke euch für euer Feedback!
Ich hoffe irgendjemand kann mir weiterhelfen
Grüße
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 666212
Url: https://administrator.de/contentid/666212
Ausgedruckt am: 25.11.2024 um 17:11 Uhr
17 Kommentare
Neuester Kommentar
Moin,
Nimm die Powershell:
Mit Get-ChildItem kannst du dir Ordnerinhalte ermitteln.
Mit einem for each kannst du dir dann das Datum jeder einzelnen Datei ermitteln .LastWriteTime
Dann noch mit der aktuellen Systemzeit (abzüglich 10 Minuten .AddMinutes(-10)) vergleichen.
Wenn ein Delta vorhanden ist, dann tu etwas.
z.B. hier
https://stackoverflow.com/questions/19774097/finding-modified-date-of-a- ...
Allerdings würde hier für JEDE Datei eine Altion ausgeführt werden. Daher würde ich eine Schleife erstellen. Sobald mit dem ersten Treffer wird dann eine Aktion ausgeführt (Mail versenden) und die Schleife beendet.
Bei 300 Dateien muss ich die Info ja nur einmal und nicht 300 mal erhalten
Gruß
em-pie
Nimm die Powershell:
Mit Get-ChildItem kannst du dir Ordnerinhalte ermitteln.
Mit einem for each kannst du dir dann das Datum jeder einzelnen Datei ermitteln .LastWriteTime
Dann noch mit der aktuellen Systemzeit (abzüglich 10 Minuten .AddMinutes(-10)) vergleichen.
Wenn ein Delta vorhanden ist, dann tu etwas.
z.B. hier
https://stackoverflow.com/questions/19774097/finding-modified-date-of-a- ...
Allerdings würde hier für JEDE Datei eine Altion ausgeführt werden. Daher würde ich eine Schleife erstellen. Sobald mit dem ersten Treffer wird dann eine Aktion ausgeführt (Mail versenden) und die Schleife beendet.
Bei 300 Dateien muss ich die Info ja nur einmal und nicht 300 mal erhalten
Gruß
em-pie
Wir haben mehrere Hotfolder, bei denen automatisch Dokumente rausgezogen werden und automatisch archiviert + durchsuchbar gemacht werden. Nun ist schon einige male passiert, dass der Dienst die Dateien nicht mehr verarbeitet hat, obwohl der Dienst noch lief. Deswegen können wir auch keine Dienst Überwachung nutzen.
Nun zu meiner Frage, gibt es die Möglichkeit bzw. hat jemand schon eine Lösung, wie ich meine ganzen Dateien überwachen kann mit dem erstellten Zeitstempel der Dokumente.
Nun zu meiner Frage, gibt es die Möglichkeit bzw. hat jemand schon eine Lösung, wie ich meine ganzen Dateien überwachen kann mit dem erstellten Zeitstempel der Dokumente.
Schon mal FSRM angeschaut, ob dessen Funktionalität schon reicht?
Auf welchem System laufen denn die Hotfolder?
Unter Linux wird das regelmäßig mit inode gelöst. Wird eine Datei geändert, erstellt, gelöscht ..., so löst inode eine Reaktion aus. Wenn in dem aufzurufenden (sh-)Script eine Zeitverzögerung mit sleep x eingebaut wird, kann das 10-min-Fenster dynamisch initialisiert werden. Freilich sollte nach dem Ablauf der Zeitverzögerung zunächst geprüft werden, ob die Datei überhaupt noch vorhanden ist, wenn das von Relevanz ist. Eine E-Mail wird sodann innerhalb des Scipts über mail abgesetzt. Insoweit alles ganz simpel.
Kommt eine Vielzahl von Dateien zur selben Zeit in Betracht, kann das dadurch kanalisiert werden, dass die Informationen zu diesen Dateien zunächst in einer temporären Datei gesammelt werden, wobei der Dateiname dieser Datei das Datum und die Urzeit (Stunde/Minute) enthält. Ein cron-Job, der jede Minute oder in einem anderen Intervall ausgeführt wird, ruft seinerseits ein zweites Script auf. Dieses zweite Script wertet alle temporären Dateien aus, die älter als die aktuelle Minute sind, und sendet in Abhängigkeit vom Ergebnis der Auswertung eine E-Mail. Die ausgewerteten temporären Dateien werden nach der Auswertung gelöscht.
Der Ansatz ist schnell umgesetzt und funktioniert sicher. Er lässt sich im Fehlerfall auch sehr gut debuggen oder überhaupt mit logging ergänzen.
Ein ähnlicher Ansatz ist mit einem FileSystemWatcher unter Windows möglich, was dem inode unter Linux entspricht.
Das kann beispielsweise in eine Webanwendung auf einem IIS, die ständig in Betrieb ist - das heißt, der Arbeitsprozess ist immer aktiv -, integriert werden. So kann der FileSystemWatcher über einen Namespace/Class beim Start des Arbeitsprozess initialisiert werden. In den Funktionen für den FileSystemWatcher ist die benötigte Reaktionsfunktionalität integriert. In dieser Art reagiert hier eine Webanwendung auf Ablagen in einem zentralen Posteingangsordner. Das "Geile" daran ist, es funktioniert auch dann, wenn das zu überwachenden Verzeichnis auf einer Netzwerkfreigabe (=/= IIS-Server) gehostet wird - das hostende Betriebssystem ist dabei "Wurscht", jedenfalls Linux oder Windows funktioniert.
Weil es sich beim FileSystemWatcher um eine Systemfunktion handelt, sollte sich das gleichsam über einen persistenten Dienst realisieren lassen. Diese Variante ist hier aber bisher mangels Erfordernis nicht verfolgt worden.
Viel Erfolg und eine gute Nacht
HansDampf06
Unter Linux wird das regelmäßig mit inode gelöst. Wird eine Datei geändert, erstellt, gelöscht ..., so löst inode eine Reaktion aus. Wenn in dem aufzurufenden (sh-)Script eine Zeitverzögerung mit sleep x eingebaut wird, kann das 10-min-Fenster dynamisch initialisiert werden. Freilich sollte nach dem Ablauf der Zeitverzögerung zunächst geprüft werden, ob die Datei überhaupt noch vorhanden ist, wenn das von Relevanz ist. Eine E-Mail wird sodann innerhalb des Scipts über mail abgesetzt. Insoweit alles ganz simpel.
Kommt eine Vielzahl von Dateien zur selben Zeit in Betracht, kann das dadurch kanalisiert werden, dass die Informationen zu diesen Dateien zunächst in einer temporären Datei gesammelt werden, wobei der Dateiname dieser Datei das Datum und die Urzeit (Stunde/Minute) enthält. Ein cron-Job, der jede Minute oder in einem anderen Intervall ausgeführt wird, ruft seinerseits ein zweites Script auf. Dieses zweite Script wertet alle temporären Dateien aus, die älter als die aktuelle Minute sind, und sendet in Abhängigkeit vom Ergebnis der Auswertung eine E-Mail. Die ausgewerteten temporären Dateien werden nach der Auswertung gelöscht.
Der Ansatz ist schnell umgesetzt und funktioniert sicher. Er lässt sich im Fehlerfall auch sehr gut debuggen oder überhaupt mit logging ergänzen.
Ein ähnlicher Ansatz ist mit einem FileSystemWatcher unter Windows möglich, was dem inode unter Linux entspricht.
Das kann beispielsweise in eine Webanwendung auf einem IIS, die ständig in Betrieb ist - das heißt, der Arbeitsprozess ist immer aktiv -, integriert werden. So kann der FileSystemWatcher über einen Namespace/Class beim Start des Arbeitsprozess initialisiert werden. In den Funktionen für den FileSystemWatcher ist die benötigte Reaktionsfunktionalität integriert. In dieser Art reagiert hier eine Webanwendung auf Ablagen in einem zentralen Posteingangsordner. Das "Geile" daran ist, es funktioniert auch dann, wenn das zu überwachenden Verzeichnis auf einer Netzwerkfreigabe (=/= IIS-Server) gehostet wird - das hostende Betriebssystem ist dabei "Wurscht", jedenfalls Linux oder Windows funktioniert.
Weil es sich beim FileSystemWatcher um eine Systemfunktion handelt, sollte sich das gleichsam über einen persistenten Dienst realisieren lassen. Diese Variante ist hier aber bisher mangels Erfordernis nicht verfolgt worden.
Viel Erfolg und eine gute Nacht
HansDampf06
Gerade solche Aufgabenstellungen wie Deine lassen sich unter Linux sehr schnell und mit relativ wenig Aufwand lösen. Daher bietet es sich durchaus an, darüber nachzudenken, entsprechende Datenverzeichnisse von Windows Server auf einen Linux-Samba-Member zu migrieren. Das ist kein Hexenwerk, und zwar erst recht nicht, wenn alles virtualisiert ist.
Viele Grüße
HansDampf06
Schaue Dir Deinen Befehl noch einmal genau an. @em-pie benannte den Befehl Get-ChildItem
Viele Grüße
HansDampf06
Viele Grüße
HansDampf06
Moin,
OK - als erstes ist es immer hilfreich, die Fehlermeldung zu kennen
dann könnte es so aussehen:
das ganze ist ungetestet und mit meinem derzeit noch rudimentärem PS-Wissen gebastelt
OK - als erstes ist es immer hilfreich, die Fehlermeldung zu kennen
dann könnte es so aussehen:
$myPath = 'c:\tmp\FolderToWatch'
$CurDt = Get-Date
# du musst ein -le nehmen, da du ja Dateien haben willst, die älter denn 10 Minuten sind
$Files = Get-ChildItem -Path $myPath | Where-Object{($_.LastWriteTime -le $CurDate.AddMinutes(-10)}
ForEach ($file in $Files) {
#Hier wäre dann deine Aktion zu platzieren, z.B. "Sende Mail)
# durch das Break sollte die Schleife beendet werden, was sinnvoll ist, wenn du nur eine Mail für alle gefundenen Dateien erhalten willst
break
}
das ganze ist ungetestet und mit meinem derzeit noch rudimentärem PS-Wissen gebastelt
Moin,
na es wird.
Eine Bitte: kannst du bitte doe Code-Tags hier nutzen.
< code >
myCode
< / code > (ohne die Leerzeichen)
dann ist das alles besser lesbar.
für dein Sendmail:
https://www.windowspro.de/script/send-mailmessage-e-mails-versenden-powe ...
Gruß
em-pie
na es wird.
Eine Bitte: kannst du bitte doe Code-Tags hier nutzen.
< code >
myCode
< / code > (ohne die Leerzeichen)
dann ist das alles besser lesbar.
für dein Sendmail:
https://www.windowspro.de/script/send-mailmessage-e-mails-versenden-powe ...
Gruß
em-pie
Edit: anonymisiere mal deine Daten in deinem Code oben
Also der Code hier klappt in einer Windows-Server 2016er Umgebung fehlerfrei:
Über die Länge des Codes mag man streiten. Geht sicherlich kürzer und schöner, aber es ist funktional
Ggf. sollte man noch via try...catch... Fehler abfangen etc. aber für einen ersten Testlauf so nutzbar
Also der Code hier klappt in einer Windows-Server 2016er Umgebung fehlerfrei:
#Set Variables
$WatchFolder = 'D:\Scripting\tmp'
$CurTimeStamp = Get-Date
$FileAge = 10 #in Minutes
$PSEmailServer = 'your.mail.srv'
$Sender = 'PowerShell@mail.srv'
$Receipt = 'the1andOnly@mail.srv'
#Get Files older then defined Age
$Files = Get-ChildItem -Path $WatchFolder | Where-Object{($_.LastWriteTime -le $CurTimeStamp.AddMinutes(-1 * $FileAge))}
#For every File...
ForEach ($File in $Files) {
Write-Host " " $File " - " $File.LastWriteTime
## ...send an E-Mail...
Send-MailMessage -to $Receipt -from $Sender -Subject "Hotfolder Alarm" -body "Dateien werden nicht bearbeitet"
## ...but stop after first match
break
}
Über die Länge des Codes mag man streiten. Geht sicherlich kürzer und schöner, aber es ist funktional
Ggf. sollte man noch via try...catch... Fehler abfangen etc. aber für einen ersten Testlauf so nutzbar