GNU/Linux >> LINUX-Kenntnisse >  >> Linux

10+ Beispiele für das Beenden eines Prozesses in Linux

In diesem Tutorial werden wir mit mehreren Beispielen über das Beenden eines Prozesses in Linux sprechen. In den meisten Fällen ist es so einfach wie die Eingabe des Befehls „kill“, gefolgt von der Prozess-ID (allgemein als PID abgekürzt).

Wie Sie sehen können, haben wir einen Prozess mit der ID 1813 beendet.

Wenn Sie ein Windows-Benutzer sind, kann es hilfreich sein, sich den Befehl „kill“ als das Linux-Äquivalent der Schaltfläche „Task beenden“ im Windows-Task-Manager vorzustellen.

Laufende Prozesse auflisten

Der Befehl „ps -e“ listet alles auf, was auf Ihrem System läuft. Selbst bei einer minimalen Installation wird der Befehl wahrscheinlich mehr als 80 Ergebnisse ausgeben, sodass es viel einfacher ist, den Befehl an „grep“ oder „more“ weiterzuleiten.

ps -e | grep name-of-process

Im Screenshot unten prüfen wir, ob SSH auf dem System läuft.

Dies gibt uns auch die PID des SSH-Daemons, die 1963 ist.

Leiten Sie zu „mehr“, wenn Sie die laufenden Prozesse Ihres Systems einzeln durchsehen möchten.

Sie können auch den Befehl „top“ verwenden, um eine Liste der laufenden Prozesse anzuzeigen. Dies ist nützlich, da es Ihnen zeigt, wie viele Systemressourcen jeder Prozess verwendet.

Die PID, der Benutzer und der Name der Ressource werden hier alle identifiziert, was nützlich ist, wenn Sie sich später entscheiden, einen dieser Dienste zu beenden.

Achten Sie auf die Spalten %CPU und %MEM, denn wenn Sie bemerken, dass ein unwichtiger Prozess wertvolle Systemressourcen verschlingt, ist es wahrscheinlich von Vorteil, ihn zu beenden!

Ein weiterer sehr effizienter Weg, um die entsprechende Prozess-ID zu erhalten, ist die Verwendung des Befehls „pgrep“. Das einzige Argument, das Sie angeben müssen, ist der Name (oder ein Teil des Namens) des laufenden Prozesses.

So sieht es aus, wenn wir nach SSH suchen. Wie Sie sehen können, gibt es eine Prozess-ID von 2506 zurück.

Einen Prozess per PID beenden

Da wir nun die PID des SSH-Daemons kennen, können wir den Prozess mit dem kill-Befehl beenden.

$ sudo kill 1963

Sie können einen abschließenden ‚ps‘-Befehl ausgeben, nur um sicherzustellen, dass der Prozess tatsächlich beendet wurde.

$ ps -e | grep ssh

Die Ergebnisse sind leer, was bedeutet, dass der Prozess erfolgreich beendet wurde. Wenn Sie bemerken, dass der Prozess weiter läuft – was normalerweise nicht passieren sollte – können Sie versuchen, ein anderes Kill-Signal an den Prozess zu senden, wie in der nächsten Sitzung behandelt wird.

Hinweis:Es ist nicht immer notwendig, „sudo“ oder das Root-Benutzerkonto zu verwenden, um einen Prozess zu beenden. Im vorherigen Beispiel haben wir den SSH-Daemon beendet, der unter dem Root-Benutzer ausgeführt wird. Daher müssen wir die entsprechenden Berechtigungen haben, um den Prozess zu beenden.

Standardsignal, das vom Kill-Befehl gesendet wird

Standardmäßig sendet der Kill-Befehl ein SIGTERM-Signal zu dem von Ihnen angegebenen Prozess.

Dies sollte es dem Prozess ermöglichen, ordnungsgemäß beendet zu werden, da SIGTERM den Prozess anweist, seine normalen Shutdown-Prozeduren durchzuführen – mit anderen Worten, es zwingt den Prozess nicht, abrupt zu beenden.

Das ist eine gute Sache, weil wir möchten, dass unsere Prozesse so heruntergefahren werden, wie sie beabsichtigt sind.

Manchmal reicht das SIGTERM-Signal jedoch nicht aus, um einen Prozess zu beenden. Wenn Sie den Kill-Befehl ausführen und feststellen, dass der Prozess noch läuft, durchläuft der Prozess möglicherweise noch seinen Shutdown-Prozess oder er hängt sich vollständig auf.

Tötung erzwingen

Um das Schließen des Prozesses zu erzwingen und auf sein normales Herunterfahren zu verzichten, können Sie ein SIGKILL-Signal mit dem Schalter -9 senden, wie hier gezeigt:

$ kill -9 processID

Es kann verlockend sein, immer den Schalter -9 an Ihre Kill-Befehle anzuhängen, da es immer funktioniert. Dies ist jedoch nicht die empfohlene Best Practice. Sie sollten es nur für Prozesse verwenden, die aufgehängt sind und sich weigern, ordnungsgemäß herunterzufahren.

Verwenden Sie nach Möglichkeit das Standardsignal SIGTERM. Dies verhindert langfristig Fehler, da es dem Prozess die Möglichkeit gibt, seine Protokolldateien zu schließen, alle verbleibenden Verbindungen zu beenden usw.

Abgesehen von den SIGTERM- und SIGKILL-Signalen gibt es eine Menge anderer Signale, die kill an Prozesse senden kann, die alle mit dem Schalter -l angezeigt werden können.

Die Zahlen neben den Namen sind das, was Sie in Ihrem „Kill“-Befehl angeben würden. Zum Beispiel ist kill -9 SIGKILL, genau wie Sie im obigen Screenshot sehen.

Für den täglichen Betrieb sind SIGTERM und SIGKILL wahrscheinlich die einzigen Signale, die Sie niemals verwenden müssen. Denken Sie nur an die anderen, falls Sie einen seltsamen Umstand haben, in dem ein Prozess empfiehlt, ihn mit einem anderen Signal zu beenden.

Wie kann man alle Prozesse nach Namen beenden?

Sie können mit dem Befehl pkill auch den Namen eines laufenden Prozesses anstelle der PID verwenden. Aber Vorsicht, das beendet alle die Prozesse, die unter dem angegebenen Namen laufen, da kill nicht weiß, welchen spezifischen Prozess Sie zu beenden versuchen.

$ pkill name-of-process

Schauen Sie sich das Beispiel unten an, wo wir fünf Prozesse mit einem einzigen pkill-Befehl beenden.

In diesem Beispiel wollten wir nur eine dieser Bildschirmsitzungen beenden; es wäre notwendig gewesen, die PID anzugeben und den normalen „kill“-Befehl zu verwenden. Andernfalls gibt es keine Möglichkeit, den Prozess, den wir beenden möchten, eindeutig anzugeben.

Wie beendet man alle Prozesse eines Benutzers?

Sie können auch den Befehl pkill verwenden, um alle Prozesse zu beenden, die von einem Linux-Benutzer ausgeführt werden. Um zu sehen, welche Prozesse unter einem bestimmten Benutzer ausgeführt werden, verwenden Sie zunächst den Befehl ps mit einem Schalter -u.

$ ps -u username

Dieser Screenshot zeigt uns, dass derzeit fünf Dienste unter dem Benutzer „Geek“ laufen. Wenn Sie alle schnell beenden müssen, können Sie dies mit pkill tun.

$ pkill -u username

Wie beendet man einen Nohup-Prozess?

Sie können den nohup-Prozess genauso beenden wie jeden anderen laufenden Prozess. Beachten Sie, dass Sie im ps-Befehl nicht nach „nohup“ suchen können, also müssen Sie mit denselben Methoden wie oben gezeigt nach dem laufenden Prozess suchen.

In diesem Beispiel finden wir ein Skript mit dem Titel „test.sh“, das mit dem Befehl nohup ausgeführt wurde. Wie Sie sehen werden, ist das Finden und Beenden ähnlich wie in den obigen Beispielen.

Der einzige Unterschied zur Ausgabe besteht darin, dass uns die Shell mitteilt, dass der Prozess beendet wurde. Das ist nicht Teil von kill, sondern ein Ergebnis der Ausführung des Skripts im Hintergrund (das kaufmännische Und in diesem Beispiel) und der Verbindung mit demselben tty, von dem aus das Skript initiiert wurde.

$ nohup ./test.sh &

Wie führe ich einen Prozess im Hintergrund aus?

Der Kill-Befehl ist eine effiziente Möglichkeit, Prozesse zu beenden, die Sie im Hintergrund ausführen. Sie haben in diesem Tutorial bereits gelernt, wie man Prozesse beendet, aber zu wissen, wie man einen Prozess im Hintergrund ausführt, ist eine effektive Kombination für die Verwendung mit dem Befehl kill.

Sie können Ihrem Befehl ein kaufmännisches Und (&) anhängen, um ihn im Hintergrund auszuführen. Dies ist nützlich für Befehle oder Skripte, deren Ausführung eine Weile dauert und Sie in der Zwischenzeit andere Aufgaben erledigen möchten.

Hier haben wir einen einfachen ‚ls‘-Befehl in den Hintergrund gestellt. Da es sich um einen Befehlstyp handelt, dessen Ausführung sehr wenig Zeit in Anspruch nimmt, erhalten wir mehr Ausgabe darüber, dass er seine Arbeit direkt danach beendet.

Die Ausgabe in unserem Screenshot lautet „Done“, was bedeutet, dass der Job im Hintergrund erfolgreich abgeschlossen wurde. Wenn Sie den Job stattdessen beenden würden, würde er in der Ausgabe „beendet“ anzeigen.

Sie können einen Job auch in den Hintergrund verschieben, indem Sie auf Ihrer Tastatur Strg+Z drücken. Das ^Z in diesem Screenshot zeigt an, dass wir Strg+Z gedrückt haben und das Skript test.sh in den Hintergrund verschoben wurde.

Sie können sehen, dass test.sh weiterhin im Hintergrund läuft, indem Sie einen ps-Befehl ausgeben.

$ ps -e | grep test.sh

Bildschirmbefehl verwenden

Eine andere Möglichkeit, einen Prozess im Hintergrund auszuführen, ist die Verwendung des Befehls „screen“. Dies funktioniert, indem im Grunde genommen ein separates Terminalfenster (oder Bildschirm und daher der Name) erstellt wird.

Jeder Bildschirm, den Sie erstellen, hat seine Prozess-ID, was bedeutet, dass es eine effiziente Möglichkeit ist, Hintergrundprozesse zu erstellen, die später mit dem Kill-Befehl beendet werden können.

Der Bildschirmbefehl wird nicht standardmäßig mit allen Linux-Installationen geliefert, daher müssen Sie ihn möglicherweise installieren.

Auf Ubuntu- und Debian-basierten Distributionen können Sie es mit dem folgenden Befehl installieren:

$ sudo apt-get install screen

Sobald Sie den Befehl „screen“ installiert haben, können Sie eine neue Sitzung erstellen, indem Sie einfach „screen“ eingeben.:

$ screen

Aber bevor Sie das tun, ist es gut, sich daran zu gewöhnen, Namen für Ihre Bildschirme anzugeben. Auf diese Weise sind sie später leicht nachzuschlagen und zu identifizieren. Alles, was Sie brauchen, um einen Namen anzugeben, ist der Schalter -S.

$ screen -S my-screen-name

Lassen Sie uns einen Bildschirm namens „testing“ erstellen und dann versuchen, ihn mit dem Befehl „kill“ zu beenden. Wir fangen so an:

Nachdem wir diesen Befehl eingegeben und die Eingabetaste gedrückt haben, gelangen wir sofort zu unserem neu erstellten Bildschirm. Hier können Sie den Prozess starten, den Sie im Hintergrund laufen lassen möchten.

Dies ist besonders praktisch, wenn Sie per SSH mit einem Server verbunden sind und einen Prozess benötigen, der auch nach dem Trennen der Verbindung weiter ausgeführt wird.

Wenn Ihr Befehl/Skript ausgeführt wird, können Sie die Verbindung zum Bildschirm trennen, indem Sie Strg+A gefolgt von D drücken (lassen Sie die Tasten Strg und A los, bevor Sie die Taste D drücken).

Wie Sie sehen können, hat der Bildschirmbefehl die Prozess-ID aufgelistet, sobald wir den Bildschirm getrennt haben. Natürlich können wir diesen Bildschirm (und den darin ausgeführten Befehl/das Skript) beenden, indem wir den Befehl kill verwenden.

Mit diesem Befehl können Sie ganz einfach die Prozess-ID Ihrer Bildschirmsitzungen nachschlagen:

$ screen -ls

Wenn wir unsere Bildschirmsitzung nicht mit dem Schalter -S benannt hätten, würde nur die Prozess-ID selbst aufgelistet. Um sich wieder mit einem der aufgelisteten Bildschirme zu verbinden, können Sie den Schalter -r verwenden:

$ screen -r name-of-screen

oder

$ screen -r PID

Im folgenden Screenshot beenden wir die von uns erstellte Bildschirmsitzung (zusammen mit allem, was darin ausgeführt wird) und geben dann einen weiteren Befehl screen -ls aus, um zu überprüfen, ob der Prozess tatsächlich beendet wurde.

Wie beendet man einen Hintergrundprozess?

In einem unserer Beispiele im vorherigen Abschnitt haben wir unser tesh.sh-Skript so eingestellt, dass es im Hintergrund ausgeführt wird. Die meisten Hintergrundprozesse, insbesondere einfache Befehle, werden problemlos beendet.

Wie bei jedem Prozess kann es jedoch vorkommen, dass sich einer im Hintergrund weigert, einfach heruntergefahren zu werden. Unser test.sh-Skript hat eine PID von 2382, also geben wir den folgenden Befehl aus:

$ kill 2383

Im Screenshot werden Sie jedoch feststellen, dass das Skript unseren Kill-Befehl ignoriert hat:

Wie wir bereits gelernt haben, ist kill -9 der beste Weg, um einen Prozess zu beenden, der aufgehängt ist oder sich weigert, sich zu beenden.

Wie beende ich gestoppte Prozesse?

Es kann nützlich sein, alle Ihre gestoppten Hintergrundjobs auf einmal zu beenden, wenn sie sich angesammelt haben und für Sie nicht mehr nützlich sind. Zum Beispiel führen wir drei Instanzen unseres test.sh-Skripts im Hintergrund aus und sie wurden gestoppt:

$ ./test.sh &

Sie können diese Prozesse mit dem Befehl ps anzeigen:

$ ps -e | grep test.sh

Oder um nur eine Liste aller angehaltenen Jobs auf dem System zu erhalten, können Sie den Befehl jobs ausführen:

$ jobs

Der einfachste Weg, alle angehaltenen Jobs zu beenden, ist der folgende Befehl:

$ kill `jobs -ps`

Oder verwenden Sie den Schalter -9, um sicherzustellen, dass die Jobs sofort beendet werden:

$ kill -9 `jobs -ps`

Der Befehl `jobs -ps` listet alle im Hintergrund laufenden PIDs von Jobs auf, weshalb wir seine Ausgabe mit dem Befehl kill kombinieren können, um alle gestoppten Prozesse zu beenden.

Kill-Operation nicht erlaubt

Wenn Sie beim Versuch, einen Prozess zu beenden, den Fehler „Vorgang nicht zulässig“ erhalten, liegt dies daran, dass Sie nicht über die erforderlichen Berechtigungen verfügen. Melden Sie sich entweder beim Root-Konto an oder verwenden Sie „sudo“ (bei Debian-Distributionen) vor Ihrem Kill-Befehl.

$ sudo kill PID

Ich hoffe, Sie finden das Tutorial nützlich. Komm immer wieder.


Linux
  1. So beenden Sie einen Zombie-Prozess unter Linux

  2. 8 Linux-Befehle für effektives Prozessmanagement

  3. kill-Befehlsbeispiele in Linux

  4. renice-Befehlsbeispiele in Linux

  5. pkill-Befehlsbeispiele in Linux

Linux nl Command Tutorial für Anfänger (7 Beispiele)

Linux-nm-Befehls-Tutorial für Anfänger (10 Beispiele)

Linux Top Command Tutorial für Anfänger (8 Beispiele)

30 Top-Befehlsbeispiele für die Überwachung unter Linux

Wie man einen Prozess unter Linux beendet

UNIX / Linux:7 praktische Beispiele für PS-Befehle zur Prozessüberwachung