Johannes Truschnigg - SRE & DevOps


Zur Suche ▼Zum Archiv ▼

Eintrag von 2009-06-01

Kurztipp: X11-Abstürze durch ACPI-Events entschärfen


Seit den späten 1980ern leistet das X11 Window System auf UNIX-Workstations treu seine Dienste. Auch von modernen GNU/Linux-Desktops ist es in Form der X.org-Distribution nicht wegzudenken. Und obwohl schon viele Jahre Entwicklungszeit in diese Software geflossen sind, stürzt sie doch auch gelegentlich ab.

Programmabstürze sind bei modernen Protected Mode-Betriebsystemen meist keine besonders schwerwiegende Sache: Die sich fehlerhaft verhaltenden Prozessabbilder werden vom Kernel auf Zuruf gnadenlos gekillt, und der Rest des System läuft von diesem Zwischenfall relativ unbeeindruckt weiter. Nicht ganz so beim X-Server: dieser bindet nämlich in der Regel alle Eingabegeräte an sich, wodurch weitere Benutzereingaben (wie zum Beispiel das manuelle Killen des X-Servers auf einem Text-Terminal) unmöglich gemacht werden. Der Linux-Kernel lässt eine Lösung dieses Dilemmas mithilfe des Magic SysRequest Keys, der hier vielleicht auch irgendwann einmal Thema sein wird, mit der Holzhammermethode zu. Mit etwas Vorbereitung auf diesen unerwünschten Ernstfall gibt es aber auch einen eleganteren Ausweg: Über ACPI-Events.

ACPI ist unter anderem dafür verantwortlich, dass moderne Betriebssysteme behutsam herunterfahren (oder z. B. einen Logout-Dialog einblenden), sobald man den Power-Button am eingeschalteten Rechner drückt. Unter GNU/Linux ist für diese Funktionalität bisher zumeist das Programm acpid verantwortlich, welches sich leicht an eigene Bedürfnisse anpassen lässt. In der Standardkonfiguration ruft es, sobald ein "button power"-Event registriert wird, /sbin/init 0 auf - das System wechselt in den Runlevel 0, in dem es vollständig herunterfährt. Mit einem kleinen Eingriff kann man das tonangebende Skript in /etc/acpi/default.sh so umstricken, dass beim ersten Betätigen des Powerbuttons auf das erste virtuelle Terminal gewechselt wird, und erst das zweite Mal Drücken den Shutdown auslöst. Dazu muss man lediglich den unter "power)" aufgeführten Aufruf von "/sbin/init 0" zu "/usr/local/sbin/revive.sh" umbiegen, und ein kleines Skript an ebendiese Stelle stellen - auf das Setzen des X-Bits dabei aber nicht vergessen!

Nach einem Restart des acipd-Initskripts kann man sich im Falle eines Absturzes des X-Server auch schon elegant durch einmaliges Drücken des Ausschalteknopfes behelfen. Wenn das wider Erwarten nichts bringt - und das System nicht gänzlich abgestürzt ist - schaltet ein zweiter Anschlag des Buttons ganz ab.

direkter Link ▲

© 2007-2019 Johannes Truschnigg | valid xhmtl & css