registriere unsachgemäßes ausschalten
registriere unsachgemäßes ausschalten
Hi,
ich brauche eine Methode/Programm/Script das merkt wenn ein debian System nicht ordnungsgemäß heruntergefahren wurde (Stromausfall oder Netzschalter gedrückt).
Es müsste doch irgendwie möglich sein, dass debian beim Booten merkt, dass es den Prozess des Herunterfahrens nicht durchlaufen hat, oder?
ich brauche eine Methode/Programm/Script das merkt wenn ein debian System nicht ordnungsgemäß heruntergefahren wurde (Stromausfall oder Netzschalter gedrückt).
Es müsste doch irgendwie möglich sein, dass debian beim Booten merkt, dass es den Prozess des Herunterfahrens nicht durchlaufen hat, oder?
Dann brauche ich mal ein bisschen Parserhilfe von erfahrenen Linuxusern...
Ich möchte mir also ein kleines Programm in C++ schreiben, dass versucht beim Systemstart herauszufinden, ob das System unsachgemäß ausgeschaltet wurde.
In meinem syslog habe ich bei sachgemäßem Ausschalten immer in einer Zeile
... exiting on signal 15 ...
und in der nächsten
... restart...
Sollte diese Kombination nicht anzutreffen sein (bzw findet mein Programm vor dem Wort "restart" nicht den Satz "exiting on signal 15") wird dies als crash registriert.
Liege ich da richtig oder gibt es noch andere Fälle im syslog, die ich nicht beachtet habe...?
Ich möchte mir also ein kleines Programm in C++ schreiben, dass versucht beim Systemstart herauszufinden, ob das System unsachgemäß ausgeschaltet wurde.
In meinem syslog habe ich bei sachgemäßem Ausschalten immer in einer Zeile
... exiting on signal 15 ...
und in der nächsten
... restart...
Sollte diese Kombination nicht anzutreffen sein (bzw findet mein Programm vor dem Wort "restart" nicht den Satz "exiting on signal 15") wird dies als crash registriert.
Liege ich da richtig oder gibt es noch andere Fälle im syslog, die ich nicht beachtet habe...?
moin, moin,
grundsätzlich würde das funktionieren. Aber: der syslogd, der diese
Meldungen erzeugt, wird aber auch von cron jeden Morgen und evt.
auch manuell neugestartet; beide Meldungen könnten auch von
anderen Prozessen ausgegeben werden.
Den Systemstart kannst du sicher erkennen, wenn dein Programm
selbst eine eindeutige Meldung ins syslog schreibt (mit syslog(3)).
Als shutdown-Meldung würde ich eher eine von diesen auswerten:
- shutdown[<pid>]: shutting down for system halt
- init: Switching to runlevel: 0
Die kennzeichnen den Beginn eines ordentlichen shutdown; ob das
System wirklich komplett sauber runtergefahren ist, merkt man beim
Neustart beim fsck.
Die ganze Parserei könntest du dir sparen, wenn du dein Programm
auch beim shutdown aufrufen würdest. Dabei kannst du eine (leere)
Datei erzeugen. Wenn die beim Start existiert, ist es gut und sie wird
wieder gelöscht.
grundsätzlich würde das funktionieren. Aber: der syslogd, der diese
Meldungen erzeugt, wird aber auch von cron jeden Morgen und evt.
auch manuell neugestartet; beide Meldungen könnten auch von
anderen Prozessen ausgegeben werden.
Den Systemstart kannst du sicher erkennen, wenn dein Programm
selbst eine eindeutige Meldung ins syslog schreibt (mit syslog(3)).
Als shutdown-Meldung würde ich eher eine von diesen auswerten:
- shutdown[<pid>]: shutting down for system halt
- init: Switching to runlevel: 0
Die kennzeichnen den Beginn eines ordentlichen shutdown; ob das
System wirklich komplett sauber runtergefahren ist, merkt man beim
Neustart beim fsck.
Die ganze Parserei könntest du dir sparen, wenn du dein Programm
auch beim shutdown aufrufen würdest. Dabei kannst du eine (leere)
Datei erzeugen. Wenn die beim Start existiert, ist es gut und sie wird
wieder gelöscht.
Beware of programmers who carry screwdrivers.
Ja, manchmal gehts echt ganz einfach Danke für den Tipp...
Nun muss es ja aber so sein, dass das Programm relativ am Ende des Shutdown-Vorgangs die Datei erzeugt und relativ am Anfang vom Bootvorgang prüft, ob diese existiert.
In welche Runleveln darf so etwas gemacht werden, bzw in welchen Runleveln hat man noch Schreibrechte auf der Platte?
Nun muss es ja aber so sein, dass das Programm relativ am Ende des Shutdown-Vorgangs die Datei erzeugt und relativ am Anfang vom Bootvorgang prüft, ob diese existiert.
In welche Runleveln darf so etwas gemacht werden, bzw in welchen Runleveln hat man noch Schreibrechte auf der Platte?
"relativ am Ende des shutdown" ist einfach. Das /-Dateisystem wird
ziemlich zuletzt (S60) unmounted und mehr brauchst du ja nicht.
Also kannst du einen S59-Link in den Runleveln 0 und 6 benutzen.
Wie "relativ am Anfang des Bootvorgangs" das eigentliche Programm
gestartet werden muß, hängt ja vor allem davon ab, was es wirklich
machen soll. Wenn es z.B. Mail verschicken soll, kann es frühestens
im Runlevel 2 (bzw. 2 bis 5, egal) mit S21 gestartet werden, weil exim
mit S20 startet.
Ich würde es allerdings immer frühestens im Runlevel 2 starten, weil
S und 1 irgendwie für Notfälle und Wartungsarbeiten reserviert bleiben
sollten. Da möchte man möglichst wenig laufen lassen.
Fall das root-Dateisystem readonly gemountet sein sollte, muß die
Test-Datei spätestens mit S39 erzeugt werden, weil die anderen
Dateisysteme füher ausgehängt werden.
ziemlich zuletzt (S60) unmounted und mehr brauchst du ja nicht.
Also kannst du einen S59-Link in den Runleveln 0 und 6 benutzen.
Wie "relativ am Anfang des Bootvorgangs" das eigentliche Programm
gestartet werden muß, hängt ja vor allem davon ab, was es wirklich
machen soll. Wenn es z.B. Mail verschicken soll, kann es frühestens
im Runlevel 2 (bzw. 2 bis 5, egal) mit S21 gestartet werden, weil exim
mit S20 startet.
Ich würde es allerdings immer frühestens im Runlevel 2 starten, weil
S und 1 irgendwie für Notfälle und Wartungsarbeiten reserviert bleiben
sollten. Da möchte man möglichst wenig laufen lassen.
Fall das root-Dateisystem readonly gemountet sein sollte, muß die
Test-Datei spätestens mit S39 erzeugt werden, weil die anderen
Dateisysteme füher ausgehängt werden.
Beware of programmers who carry screwdrivers.
Man kann auch große Teile von /var readonly mounten, z.B. auf
Firewall-Rechnern. Das Logging funktioniert dann per Netzwerk
auf einen anderen Rechner. Aber normal ist das nicht. Und dann
wieder: auf einem Rechner ohne schreibbares Dateisystem braucht
man sich auch nicht um einen sauberen shutdown zu kümmern.
Also: wenn du die Datei so spät wie möglich erzeugen willst, kommt
nur das root-Dateisystem in Frage, ansonsten dürfte /var/tmp der
beste Platz sein.
Firewall-Rechnern. Das Logging funktioniert dann per Netzwerk
auf einen anderen Rechner. Aber normal ist das nicht. Und dann
wieder: auf einem Rechner ohne schreibbares Dateisystem braucht
man sich auch nicht um einen sauberen shutdown zu kümmern.
Also: wenn du die Datei so spät wie möglich erzeugen willst, kommt
nur das root-Dateisystem in Frage, ansonsten dürfte /var/tmp der
beste Platz sein.
Beware of programmers who carry screwdrivers.
Hier mal eine Vorversion von dem Programm (logsyscrash) (noch nicht fertig getestet). Sollte aber eigentlich funktionieren
http://cpp.sourceforge.net/?show=40619
Beim Herunterfahren sollte es so
und beim Hochfahren so
ausgeführt werden.
Dabei sollte jeweils immer nach /var/log/ und /var/tmp geschrieben werden können.
Damit es funktioniert muss es in den Runlevel 0 (S59*), 6 (S59*) und S (S81*) ausgeführt werden.
In der Datei /var/log/logsyscrash liegen dann Informationen zu eventuellen Systemabsürzen vor...
http://cpp.sourceforge.net/?show=40619
Beim Herunterfahren sollte es so
Code: Alles auswählen
logsyscrash --shutdown
Code: Alles auswählen
logsyscrash --boot
Dabei sollte jeweils immer nach /var/log/ und /var/tmp geschrieben werden können.
Damit es funktioniert muss es in den Runlevel 0 (S59*), 6 (S59*) und S (S81*) ausgeführt werden.
In der Datei /var/log/logsyscrash liegen dann Informationen zu eventuellen Systemabsürzen vor...
Zuletzt geändert von tobb am 23.09.2007 14:53:16, insgesamt 1-mal geändert.
Wer es haben will:
logsyscrash 1.0.0
http://cpp.sourceforge.net/?show=40630
Funktioniert wie im letzten Thread beschrieben.
Zusätzliche Option:
Ich werde es jetzt bei savannah.nongnu.org anmelden.
logsyscrash 1.0.0
http://cpp.sourceforge.net/?show=40630
Funktioniert wie im letzten Thread beschrieben.
Zusätzliche Option:
Code: Alles auswählen
--version Zeigt die Programmversion an.
Ich werde es jetzt bei savannah.nongnu.org anmelden.