Programm-Abstürze unter Ubuntu Linux handhaben
Jedes Betriebssystem hat hin und wieder Fehler, die früher oder später beseitigt werden und wenn es nicht das Betriebssystem ist, dann vielleicht eine Anwendung. In der Regel kann man eine abgestürzte Anwendung über die Systemüberwachung unter System → Systemverwaltung abschießen. Dazu klickt man mit der rechten Maustaste auf die gewünschte Anwendung und probiert es zunächst mit Prozess beenden. Klappt dies nicht, kann man noch immer den Prozess abwürgen. Doch was tun, wenn die Anwendung das System stark auslastet oder gar die GUI komplett blockiert? Die Maus lässt sich dann zwar noch bewegen, aber alles steht still und man kann noch so viel klicken und drücken, aber nix passiert.
Bevor man das System nun neu startet und womöglich noch nicht gespeicherte Daten flöten gehen, gibt es noch die Möglichkeit die jeweilige Anwendung über die Shell abzuschießen. Dazu kann man mit Strg + Alt + F1 bis F6 in eine der virtuellen Konsolen wechseln. Dort logt man sich wie gewohnt ein und schon kann man sich auf die Jagd nach dem Übeltäter begeben. Zurück zur GUI geht es übrigens mit F7, manchmal auch F9.
Bei stark ausgelasteten Systemen kann es allerdings etwas dauern, bis die Shell erscheint oder ausgeführte Befehlszeilen verarbeitet werden. Wem eventuell nicht gespeicherte Daten lieb sind, der sollte sich in Geduld üben.
X abschließen
Die einfachste Möglichkeit, vom Benutzer ausgeführte Prozesse (!) schnell abzuschießen ist oft einfach den Grafikserver – genannt X – abzuschießen. In der Regel lösen sich damit die meisten Schwierigkeiten in Luft auf, allerdings lösen sich damit in der Regel auch meistens alle nicht gespeicherten Daten in Luft auf. Dazu drückt man unter Ubuntu ab Version 9.10 Strg + Alt + Druck/Print und anschließend K, wobei man die zuvor gedrückten Tasten nicht loslassen darf. Bei älteren Versionen dürfte die Tastenkombination Strg + Alt + Entf/Del das gleiche bewirken.
Um diese Tastenkombination auszuführen, bedarf es übrigens nicht eines Wechsels in die Shell, beispielsweise mittels Strg + Alt + F1.
top
Ist man schon mal in der Shell, so kann man mit dem Befehl top, einem einfach zu bedienenden und informativen Tool, die laufenden Prozesse einsehen. Das Programm aktualisiert die Ansicht alle paar Sekunden, so dass je nach Prozessorauslastung die jeweiligen Prozesse über den Bildschirm „hüpfen”.
Durch drücken der Taste K und die eingabe der jeweiligen PID eines Prozesses, erlaubt es das Programm einen Prozess zu „killen”. Mit der Taste Q kann man das Programm wieder verlassen. Wer sein zu beobachtendes Programm in der Liste nicht findet, kann es auch explizit beobachten lassen:
top -p PID
Root-Prozesse lassen sich allerdings nur abschließen, wenn man top zuvor mit sudo ausgeführt hat!
Wer sich außerdem sicher ist, einen Prozess killen zu wollen, den man selbst oder den ein bestimmter Benutzer ausgeführt hat, der kann sich auch explizit nur die Prozesse eines Benutzers anzeigen lassen:
top -u BENUTZERNAME
Dies dürfte für etwas mehr Übersicht im Prozess-Gewusel sorgen.
PID herausfinden
Ok, schön. Jetzt haben wir das Programm eben in top nicht gesehen und wissen auch nicht die PID des gewünschten Prozesses. Was nun? Mittels pidof kann man ganz leicht die PID eines laufenden Prozesses herausfinden. Alles was man dazu wissen muss, ist der Prozessname. Also nehmen wir also zum Beispiel an, wir möchten Firefox abschießen, so können wir die PID des Firefox-Prozesses wie folgt abfragen:
pidof firefox
Als Rückgabe erhalten wir eine Nummer, welches die PID des Firefox-Prozesses ist.
Prozess und PID finden
Manchmal kommt es aber vor, dass der gewünschte Prozessname anders lautet, als man denkt. Dies ist zum Beispiel bei der Schriftenverwaltung „Specimen” der Fall. Wir wissen aber zumindest den ungefähren Namen. Also können wir mittels ps und einer grep-Pipe die PID der Schriftenverwaltung wie folgt abfragen:
ps -fe | grep specimen
Als Ausgabe erhalten wir dann etwas in der Art:
benutzer 24230 1 3 19:20 ? 00:00:02 /usr/bin/python /usr/bin/gnome-specimen
benutzer 24675 29046 0 19:21 pts/0 00:00:00 grep specimen
Die erste Zeile ist die gewünschte Anwendung, die wir abschießen möchten. Hier finden wir die PID in der zweiten Spalte und diese lautet 24230. Die zweite Zeile ist unsere grep-Abfrage.
Was hier geschieht, ist ganz einfach: Mittels ps -fe lassen wir uns eine detaillierte Liste aller Prozesse ausgeben. Diese Liste wird allerdings nicht auf dem Bildschirm ausgegeben, sondern über eine Pipe (eine Art virtuelles Rohr) an grep weiter gereicht, was nun jede Zeile ausgibt, in der der String specimen vorkommt.
Wer möchte, kann sich auch die ganze Prozessliste anzeigen lassen:
ps -fe
Scrollen kann man in der Shell übrigens auch. Dazu hält man die Shift-Taste gedrückt und bewegt sich auf und ab mit den Bild ↑ und Bild ↓ beziehungsweise Page ↑ und Page ↓ Tasten.
Der Killer-Instinkt
Ok, nun gehen wir davon aus, dass wir den Übeltäter haben. Jetzt geht es darum ihn los zu werden. Bitten wir den Prozess zunächst höflich sich sauber aus dem Staub zu machen:
kill -TERM [PID]
Also zum Beispiel:
kill -TERM 24230
Können wir ihn dazu nicht überreden, dann müssen wir direkter werden und ihn schlichtweg killen:
kill -KILL 24230
Bei Prozessen, die man nicht selbst ausgeführt hat, muss man natürlich noch ein sudo vorne anhängen. Statt der Option -TERM wird oft auch die Option -15 und statt der Option -KILL die Option -9 verwendet.
Wer dagegen der Prozessnamen weiß, kann diesen natürlich auch auf direktem Wege umlegen, dazu bedarf es nicht einer vorherigen Recherche bezüglich der PID:
killall -TERM firefox
Beziehungsweise auch wieder auf die harte Tour:
killall -KILL firefox
Und schließlich gibt es da noch die Methode für die ganz verzweifelten:
killall5
Dieser Befehl schießt alles ab, was kein Kernel-Thread ist und von dem Befehl selbst zur Ausführung nicht gebraucht wird und wofür es auch die Zugriffsrechte besitzt (in dem Falle nicht als sudo ausgeführt). Nicht gespeicherte Daten gehen mit großer Sicherheit damit allerdings verloren.
Wer hat in meinem Bettchen geschlafen?
In einigen vermutlich eher seltenen Fällen kann es durchaus mal sein, dass man einen Übeltäter ganz anderer Art abschießen möchte, nämlich den, der gerade auf eine bestimmte Datei, ein bestimmtes Verzeichnis, Dateisystem oder einen bestimmten Socket zugreift.
Nehmen wir beispielsweise an, wir möchte herausfinden, welche Prozesse auf das eigene Heimverzeichnis zugreifen. Um eine entsprechende Liste an Prozessen zu erhalten, führen wir folgendes aus:
fuser -uv ~
Die Liste besteht nun aus vier Spalten: USER, PID, ACCESS und COMMAND. Unter COMMAND findet sich der Prozessname wieder, PID bezeichnet die Prozess-ID und unter ACCESS sehen wir, wie auf die Datei zugegriffen wird (siehe auch: man fuser).
Alle Prozesse, die auf eine Datei zugreifen, lassen sich auch gleich mittels der nachfolgenden Zeile und einer interaktiven Abfrage killen:
fuser -uvki ~
Darüber hinaus lässt sich mit fuser auch herausfinden, welcher Prozess gerade an einem TCP- oder UDP-Port lauscht:
fuser -uv -n tcp mail
Oder auch durch Angabe der Portnummer:
fuser -uv -n tcp 80
Oder man kann rausfinden ob, und wenn ja, welcher Prozess gerade auf das CD- beziehungsweise DVD-Laufwerk zugreift:
fuser -uv /media/cdrom
In jedem Falle erhält man eine Liste mit Prozess-IDs und -Namen.
Und nun viel Spaß und Erfolg beim Suchen und Killen! ;)
-
rabidrabbithole liked this
-
ubuntujunkie posted this