registriere unsachgemäßes ausschalten

Alles rund um sicherheitsrelevante Fragen und Probleme.
Antworten
tobb
Beiträge: 1032
Registriert: 27.01.2006 17:48:13

registriere unsachgemäßes ausschalten

Beitrag von tobb » 19.09.2007 21:31:59

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?

pluvo

Beitrag von pluvo » 20.09.2007 23:31:14

Du könntest unter "/var/log/fsck" schauen, ob etwas im Log von Partitionen steht, die nicht richtig ausgehangen (unmount) wurden und einer fsck-Prüfung unterzogen wurden :P

comes
Beiträge: 2702
Registriert: 11.03.2005 07:33:30
Wohnort: /dev/null
Kontaktdaten:

Beitrag von comes » 21.09.2007 08:45:16

im syslog sollte vermerkt sein, dass ein shutdown vorgenommen wurde, wenn er regulär eingeleitet wurde. wenn der eintrag nicht da ist, wars also ein harter poweroff. das teil parsen und auswerten
grüße, comes

Faschismus ist keine Meinung, sondern ein Verbrechen!
http://sourcewars.de

tobb
Beiträge: 1032
Registriert: 27.01.2006 17:48:13

Beitrag von tobb » 21.09.2007 21:41:13

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

cosmac
Beiträge: 4573
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 22.09.2007 12:00:56

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.
Beware of programmers who carry screwdrivers.

tobb
Beiträge: 1032
Registriert: 27.01.2006 17:48:13

Beitrag von tobb » 22.09.2007 13:42:24

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?

cosmac
Beiträge: 4573
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 22.09.2007 15:41:07

"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.
Beware of programmers who carry screwdrivers.

tobb
Beiträge: 1032
Registriert: 27.01.2006 17:48:13

Beitrag von tobb » 22.09.2007 16:28:24

Und wenn ich die Testdatei nach /var/lib, /var/tmp oder /var/chache schreibe?
Wer mounted denn /var als read-only? Dann hat man ja garkeine Logs mehr...?

cosmac
Beiträge: 4573
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 22.09.2007 19:35:28

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.
Beware of programmers who carry screwdrivers.

tobb
Beiträge: 1032
Registriert: 27.01.2006 17:48:13

Beitrag von tobb » 23.09.2007 01:04:28

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

Code: Alles auswählen

logsyscrash --shutdown
und beim Hochfahren so

Code: Alles auswählen

logsyscrash --boot
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...
Zuletzt geändert von tobb am 23.09.2007 14:53:16, insgesamt 1-mal geändert.

tobb
Beiträge: 1032
Registriert: 27.01.2006 17:48:13

Beitrag von tobb » 23.09.2007 14:48:37

Wer es haben will:

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.

tobb
Beiträge: 1032
Registriert: 27.01.2006 17:48:13

Beitrag von tobb » 24.09.2007 09:38:01

Sorry, der Link geht nicht.

Neuer Link:
http://pastebin.com/f73f23332

Antworten