Hängendes Programm unter Linux beenden

5 min


Loading

Es kann ab und an einmal vorkommen, daß auch unter Linux ein Programm in einen ungeplanten Fehler läuft und sich somit aufhängt. Was tun, wenn ein Klick oben rechts oder links im Fenster auf das kleine X das jeweilige Programm nicht schließt? Ich zeige Dir verschiedene Wege, ein hängendes oder abgestürztes Programm zu beenden. Viel Spaß

Unter jedem Betriebssystem und mit jedem Programm kann es schon mal vorkommen, daß es an irgendeiner Stelle zwickt und ein Programm nicht mehr so mag, wie man eigentlich will. Unter Linux gibt es verschiedene Möglichkeiten hier ein hängendes Programm oder auch Zombie-Prozess genannt abzuschießen.

Programme beenden bzw. abschießen

In der grafischen Oberfläche:

Wir starten die Systemüberwachung und suchen das entsprechende Programm heraus. Nun auf den jeweiligen Prozess mit einem Rechtsklick -> Beenden klicken. Hilft das nicht, geht auch Prozess -> beenden. In vielen Fällen sollte das schon genug sein und das Programm gezwungenermaßen beendet worden sein. Ein normaler Start ist jetzt wieder möglich.

In der Konsole:

Wir öffnen eine Konsole und geben folgenden Befehl ein:

ps -ef | grep PROGRAMNAME

Wenn z.B. Firefox hängen sollte, hieße das:

ps -ef | grep firefox

Wenn z.B. Thunderbird hängen sollte, hieße das:

ps -ef | grep thunderbird

michlfrankekn     1650  1489  0 Jul31 ?        00:06:29 /usr/lib/thunderbird/thunderbird

michlfranken    28431 28383  0 08:30 pts/1    00:00:00 grep thunderbird

Aus diesem Auszug können wir nun folgendes erkennen:

Die obere Zeile ist der Prozess Thunderbird und die untere Zeile unser Grep – Befehl nach dem Thunderbird Prozess. Der Thunderbird Prozess hat die ID „1650“

Um nun Thunderbird via Terminal zu beenden, müssen wir einen kill Befehl absetzen:

kill 1650

Wenn das nicht hilft, müssen wir mit der groben Kelle kommen und geben dem kill Befehl noch einen Parameter zum sofortigen Abschießen mit:

kill -9 1650

Damit würgt Ihr hängende Prozesse hab. Wenn jetzt ein Programm mehrere Prozesse hat, könnte die Prozessliste lang werden. Hätte in unserem Beispiel Thunderbird noch zwei oder drei weitere Prozesse, die die PID 1651 und 1652 hätte, könnten wir den Befehl wie folgt um diese Prozesse ergänzen:

kill 1650 1651 1652

bzw.

kill -9 1650 1651 1652

Wenn wir jetzt aber vielleicht 50 oder mehr Thunderbird Prozesse haben, wird es schnell sehr mühsam das alles abzutippen. Hier könnten wir mit einer Variante des kill Befehls arbeiten, dem killall. In unserem Beispiel sähe das so aus:

killall thunderbird

Damit würden alle dem Thunderbird angehörigen Prozesse mit beendet. Killall würde ich aber immer nur dann verwenden, wenn gefahlos eine Anwendung beendet werden kann. Es kann auch vorkommen, daß „Child Prozesse“ inkonsistent wurden, aber der „Parent Prozess“ noch problemlos läuft und auch nicht beendet werden darf. Im Geschäftsumfeld kann dieses Szenario durchaus als praxisnah erachtet werden. Hier wäre ein leichtfertig abgesetzter Killall – Befehl kontraproduktiv.

Mögliche Parameter sind:

kill --help

kill: kill [-s Signalname | -n Signalnummer | -Signalname] pid | jobspec … oder kill -l [Signalname]

    Send a signal to a job.

    Send the processes identified by PID or JOBSPEC the signal named by

    SIGSPEC or SIGNUM.  If neither SIGSPEC nor SIGNUM is present, then

    SIGTERM is assumed.

    Options:

      -s sig SIG is a signal name

      -n sig SIG is a signal number

      -l list the signal names; if arguments follow `-l’ they are

        assumed to be signal numbers for which names should be listed

      -L synonym for -l

    Kill is a shell builtin for two reasons: it allows job IDs to be used

    instead of process IDs, and allows processes to be killed if the limit

    on processes that you can create is reached.

    Exit Status:

    Returns success unless an invalid option is given or an error occurs.

killall --help

Aufruf: killall [-Z CONTEXT] [-u USER] [-y TIME] [-o TIME] [-eIgiqrvw]

                [-s SIGNAL | -SIGNAL] NAME…

       killall -l, –list

       killall -V, –version

  -e,–exact          genaue Übereinstimmung für sehr lange Namen verlangen

  -I,–ignore-case    nicht zwischen Groß- und Kleinschreibung unterscheiden

  -g,–process-group  Prozessgruppe statt Einzelprozess abbrechen

  -y,–younger-than   Prozesse jünger als ZEIT abbrechen

  -o,–older-than     Prozesse älter als ZEIT abbrechen

  -i,–interactive    vor Abbruch Bestätigung des Benutzers einholen

  -l,–list           alle bekannten Signalnamen auflisten

  -q,–quiet          keine Warnungen und Fehler ausgeben

  -r,–regexp         NAME ist ein erweiteter regulärer Ausdruck

  -s,–signal SIGNAL  benutzerdefiniertes Signal anstatt SIGTERM senden

  -u,–user USER      nur Prozesse von angegebenem Benutzer abbrechen

  -v,–verbose        benachrichtigen, falls das Signal erfolgreich gesendet

                      wurde

  -V,–version        Version anzeigen

  -w,–wait           auf das Beenden der Prozesse warten

  -n,–ns PID         nur Prozesse aus demselben Namensraum wie PID

                      berücksichtigen

  -Z,–context REGEXP nur Prozesse abbrechen, die einen Kontext haben

                        (muss vor anderen Argumenten stehen)

Es muß also mit einem gewissen Augenmaß an die Sache herangegangen werden. Eine generelle Empfehlung läßt sich nicht aussprechen. Man sollte immer Fall für Fall entscheiden ob es besser ist die einzelnen Prozess IDs zu beenden oder gleich alle Prozesse, die zu einem Programm gehören. Die obigen Beispiele sind ein Auszug, wie ich hier vorgehe in der Praxis. Natürlich gibt es darüber hinaus noch weitere Methoden und Vorgehensweisen.

Weitere Beschreibungen zu den Signal Parametern, findet ihr hier

https://www.cyberciti.biz/faq/unix-kill-command-examples/

Das zu diesem Artikel korrespondierende Video kann auf meinem YouTube Kanal hier angeschaut werden.

Folgt mir gerne auch auf:

Um unabhängig von großen Plattformen zu sein, benötige ich Deine Unterstützung. Dies geht via:

Alle Details zu hier.

Du möchtest mehr über Linux lernen?

Hinweise:

  • Als Amazon-Partner verdiene ich an qualifizierten Verkäufen
  • Ich besitze eine legale Lizenz von Final Cut Pro X, die die kommerzielle Verwendung von lizenzfreien Inhalten in FCP abdeckt
  • Die Beiträge von MichlFranken stellen grundsätzlich eine unverbindliche Demo dar. Nachstellung auf eigene Gefahr. Es können bei unsachgemäßer Nachstellung negative Folgeeffekte wie z.B. Datenverlust oder Systemausfälle auftreten. Jede Form der Gewährleistung ausgeschlossen. Im Zweifelsfall bitte eine virtuelle Maschine aufsetzen und testen aber nicht auf einem produktiven System nachstellen.

2 Comments

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

  1. Mir war das alles zu umständlich. Habe Linux Mint erst 1/2 Jahr.
    Ich habe die angegebene Datei in meiner extra Ablage gesucht und mit einem Buchstaben umbenannt. Libre Office ein- / zweimal neu starten und alles ist ok.
    Jetzt dauert der Start nur 2-3 sec. 🙂