Archiv verlassen und diese Seite im Standarddesign anzeigen : dienst neustarten bei bestimmer zeile in datei
hallo,
ich benötige eure hilfe, da ich weder linux noch script wirklich kann (gutes eutsch)
naja auf jeden fall habe ich probleme mit meinem drucker. alle nase lang hört der auf zu drucken und in der cups err_log steht sowas:
E [28/Aug/2007:20:08:52 +0200] [Job 138] check device; will retry in 30 seconds..
und das wiederholt sich alle 30 sek.
jetzt hätte ich gerne ein script was alle 5 min. die letzte zeile der error_log ausliest checkt ob der drucker mucken macht und cupssys neustartet.
das würde ich evt noich hinbekommen. das problem ist dabei ja aber , dass ich die uhrzeit irgendwie speichern muss, um zu prüfen ob dies ein neuer eintrag ist.
könntet ihr mir da irgendwie helfen???
wolfgang
Moin,
nein, die Uhrzeit brauchst Du nicht zu speichern. Du brauchst doch nur prüfen, ob die letzte Meldung jünger als 5 Minuten ist, dann ist sie nach dem letzten Script-Lauf reingekommen.
Du kannst das Script ungefähr so machen (nicht ausgetestet):
last="`tail -n 1 err_log | grep '^E ' | sed -r 's/^E \[([0-9]+)\/([A-Za-z]+)\/([0-9]+):([0-9]+):([0-9]+):([0-9]+) ([0-9\+]+).*/\2\-\1-\3 \4:\5:\6 \7/'`"
test -z "$last" && exit
sek_last=`date -d "$last" +%s`
diff=`expr \`date +%s\` - $sek_last`
test $diff -ge 300 && starte_drucker_neuIm Einzelnen:
In der 1. Zeile wird der Variablen last die Ausgabe der nachfolgend beschriebenen Kommandos zugewiesen.
1. tail -1 err_log liest die letzte Zeile des Logs
2. grep '^E ' liefert die Zeile nur dann weiter, wenn sie mit E (Error) beginnt
3. der etwas umfängliche sed baut aus dem Teil der Zeile, der Datum und Uhrzeit (also der Zeichenkette "28/Aug/2007:20:08:52 +0200") enthält etwas, was der date-Befehl interpretieren kann.
Das sieht im Ergebnis so aus: "Aug-28-2007 20:08:52 +0200"
Die Zeile test -z "$last" && exit lässt das Script aussteigen, wenn $last leer ist (dann war die letzte Logzeile kein Fehler).
Mit sek_last=`date -d "$last" +%s` wird das in der 1. Zeile ermittelte Datum in Sekunden seit dem 01.01.1970 00:00:00 Uhr umgewandelt (Unix-Zeit 0) und der Variablen sek_last zugewiesen.
Dann wird per diff=`expr \`date +%s\` - $sek_last` die Differenz in Sekunden zwischen der aktuellen Uhrzeit und der in $sek_last
gespeicherten ermittelt und der Variablen $diff zugewiesen.
Der abschließende test $diff -ge 300 && starte_drucker_neu prüft, ob die ermittelte Differenz > 5 Minuten (300 Sekunden) ist und ruft dann das Programm starte_drucker_neu auf (&& nach einem Befehl heisst: wenn der vorangegangene Befehl den Returncode 0 hatte, mache mit dem nach && folgenden weiter).
HTH
Jan
Anmerkung: Zeile 1 habe ich gestestet ;-)
P.S.: Wieso zum Geier kocht jedes Programm sein eigenes Süppchen, wenn es um Datum und Zeitstempel in Logs geht??? Es kann doch nicht so schwer sein, einfach einheitlich das ISO-Format YYYY-MM-DD hh:mm:ss[.fract] zu benutzen! Dann wäre die Hälfte der im Web kursierenden RegEx-Ausdrücke überflüssig.:mad:
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.