Hallo liebes Forum,
vielleicht habt Ihr ja ein paar Ideen zum Thema.
Wir haben hier ein selbsgebasteltes Faxscript welches 2 Logfiles beschickt (faxerr.log und faxok.log). Das Script ist deshalb individuell erstellt worden, weil in diese Logfiles noch z.B. Auftragsnummern mit rein geschrieben werden.
Mein Problem ist folgendes: Bei täglich mehreren hundert Faxen verliert man den Überblick von gesendeten und fehlerhaften Faxen. Das schwierige an der Sache ist, dass es vorkommt, das eine Auftragsnummer mehrfach am Tag gesendet wird und nun kann es sein das es Morgens als Fehler abgeheftet wird, aber Mittags alles klappt und Abends wieder nich.
Ich möchte nun das Script ergänzen, dass er noch ein Logfile erzeugt, wo man die bisher noch nicht erfolgreich versendeten Auftragsnummer findet.
Meine Idee war alle fehlerhaften Auftragsnummern in die neue Logdatei zu schreiben und und jedes mal wenn eine OK ist, einen entsprechenden Fehlereintrag zu löschen.
Meine Fragen:
Gibt es eine (einfache) Möglichkeit die entsprechenden Einträge in der Logdatei zu löschen?
Würdet ihr das auch so lösen, oder gibts dafür einfachere Wege, die mir nicht einfallen?
Vielen Dank schonmal für eure Mühe
Eure Ideen zur Fehlerzusammenfassung
hi,
wenn das Anhängen von neuen und das Löschen von alten Einträgen niemals
gleichzeitig passieren kann (weil es z.B. im gleichen Script passiert und davon
nur eine Instanz laufen kann), reicht eigentlich:
Der Suchbegriff muss natürlich eindeutig sein, die Auftragsnr. allein kommt also
nicht in Frage. Und er darf nicht mit z.B. der Telefonnr. an anderer Stelle der Zeile
verwechselt werden. Dazu steht er im Beispiel am Zeilenanfang und es folgt ein
Zwischenraum.
Alternativ kann man für jedes Problem-Fax eine eigene Datei erzeugen und die
dann bei Bedarf wieder löschen. Der Vorteil ist, dass Erzeugen und Löschen
unabhängig voneinander passieren dürfen. Wenn diese Dateien in einem extra
Verzeichnis stehen, liefert z.B. ein "cat faxen/probleme/*" die gleiche Information
wie die einzelne Log-Datei.
Bei weniger als 100 Problem-Faxen am Tag sollte das auch schnell genug sein.
wenn das Anhängen von neuen und das Löschen von alten Einträgen niemals
gleichzeitig passieren kann (weil es z.B. im gleichen Script passiert und davon
nur eine Instanz laufen kann), reicht eigentlich:
Code: Alles auswählen
grep -v "^123456 " logfile > /tmp/logfile.tmp
mv /tmp/logfile.tmp logfile
nicht in Frage. Und er darf nicht mit z.B. der Telefonnr. an anderer Stelle der Zeile
verwechselt werden. Dazu steht er im Beispiel am Zeilenanfang und es folgt ein
Zwischenraum.
Alternativ kann man für jedes Problem-Fax eine eigene Datei erzeugen und die
dann bei Bedarf wieder löschen. Der Vorteil ist, dass Erzeugen und Löschen
unabhängig voneinander passieren dürfen. Wenn diese Dateien in einem extra
Verzeichnis stehen, liefert z.B. ein "cat faxen/probleme/*" die gleiche Information
wie die einzelne Log-Datei.
Bei weniger als 100 Problem-Faxen am Tag sollte das auch schnell genug sein.
Beware of programmers who carry screwdrivers.
Hallo,
wenn du sagst dass du ein Problem hast sie zu unterscheiden, waere es dann nicht vielleicht sinnvoll die Urzeit anzuhaengen? somit weiss man immer genau wann das war?
zum Thema filtern, ich glaube grep is da schon ne gute Loesung. Nur ich wuerde mir fast ueberlegen irgendeine Skriptsprache zu nehmen um sowas zu verwirklichen, weils einheitlicher is (ruby,python,perl.....)
wenn du sagst dass du ein Problem hast sie zu unterscheiden, waere es dann nicht vielleicht sinnvoll die Urzeit anzuhaengen? somit weiss man immer genau wann das war?
zum Thema filtern, ich glaube grep is da schon ne gute Loesung. Nur ich wuerde mir fast ueberlegen irgendeine Skriptsprache zu nehmen um sowas zu verwirklichen, weils einheitlicher is (ruby,python,perl.....)
Danke für die Antworten.
@cosmac
Dafür ist die Alternative wirklich einfach und funktionell. Danke. (das ich da nicht von selbst drauf gekommen bin )
Schön wäre es natürlich gewesen, wenn es doch mit einer Datei geklappt hätte.
Und genau an diesem Punkt wirft sich mir eine Frage auf:
In ein Logfile kann ich via ">>" von hunderten Programmen ohne Probleme etwas hineinschreiben lassen. Aber wenn ich jetzt eine Zeile löschen möchte muss ich "Datei lesen"->"Auswertung"->"erzeugen einer neuen Datei" ?
Aber danke nochmal, meine eigentliches Problem ist gelöst.
@cosmac
Leider dochwenn das Anhängen von neuen und das Löschen von alten Einträgen niemals gleichzeitig passieren kann...
Dafür ist die Alternative wirklich einfach und funktionell. Danke. (das ich da nicht von selbst drauf gekommen bin )
Schön wäre es natürlich gewesen, wenn es doch mit einer Datei geklappt hätte.
Und genau an diesem Punkt wirft sich mir eine Frage auf:
In ein Logfile kann ich via ">>" von hunderten Programmen ohne Probleme etwas hineinschreiben lassen. Aber wenn ich jetzt eine Zeile löschen möchte muss ich "Datei lesen"->"Auswertung"->"erzeugen einer neuen Datei" ?
Aber danke nochmal, meine eigentliches Problem ist gelöst.
Wenn ich eine Zeile wirklich lösche, muss ja der Rest der Datei nach
vorn verschoben werden, d.h. mindestens der Rest muss neu auf die
Platte geschrieben werden. Wenn während der Zeit jemand was hinten
anhängen will, müssen sich beide Schreiber irgendwie einigen.
In einem C-Programm kann man mit "fseek()" mitten in eine Datei schreiben
ohne den Rest zu berühren. Damit kann man einen Eintrag logisch löschen,
aber der Platzbedarf bleibt konstant. Die entsprechende Funktion auf der
Kommandozeile wäre z.B.:
Der Einfachheit halber sollten alle Zeilen gleich lang sein und auch
die "---" müssen die richtige Länge haben (Zeileende = 1 Byte).
Es ist aber nicht garantiert, dass sowas mit mehreren Schreibern funktioniert
Die korrekte Methode wäre ein " advisory lock" in allen beteiligten Programmen.
In C gibt es flock(), aber in einem Script???
vorn verschoben werden, d.h. mindestens der Rest muss neu auf die
Platte geschrieben werden. Wenn während der Zeit jemand was hinten
anhängen will, müssen sich beide Schreiber irgendwie einigen.
In einem C-Programm kann man mit "fseek()" mitten in eine Datei schreiben
ohne den Rest zu berühren. Damit kann man einen Eintrag logisch löschen,
aber der Platzbedarf bleibt konstant. Die entsprechende Funktion auf der
Kommandozeile wäre z.B.:
Code: Alles auswählen
echo "---" | dd bs=$ZEILENLAENGE seek=$ZEILENNR count=1 conv=notrunc of=logfile
die "---" müssen die richtige Länge haben (Zeileende = 1 Byte).
Es ist aber nicht garantiert, dass sowas mit mehreren Schreibern funktioniert
Die korrekte Methode wäre ein " advisory lock" in allen beteiligten Programmen.
In C gibt es flock(), aber in einem Script???
Beware of programmers who carry screwdrivers.
Danke für die Antwort. Wieder was dazu gelernt.
Aber ich denke, dass damit der Rahmen gesprengt wird, dann bleibe ich jetzt doch bei der ersten Variante.
Aber ich denke, dass damit der Rahmen gesprengt wird, dann bleibe ich jetzt doch bei der ersten Variante.
Ich könnte mir diesem Fall höchstens einen Workaround vorstellen, in dem man einfach eine lock-Datei vorm schreiben erstellt und diese nach dem Schreibvorgang wieder löscht. Sollte dann eine Instanz diese Datei vorfinden, dann wird eine kurze Pause gemacht und dann nochmal probiert.Die korrekte Methode wäre ein " advisory lock" in allen beteiligten Programmen. In C gibt es flock(), aber in einem Script???