Stoppen des Linux-Prozesses. Prozesse unter Linux beenden – Befehle ps, kill und killall. Beenden Sie einen Prozess unter Linux – Befehle kill und killall

💖 Gefällt es dir? Teilen Sie den Link mit Ihren Freunden

Das Argument -9 (oder KILL) des Kill-Befehls sollte auf POSIX-kompatiblen Systemen nur verwendet werden, wenn dies unbedingt erforderlich ist. Warum? Das KILL-Signal kann vom Prozess nicht verarbeitet werden. Das bedeutet, dass nach dem Beenden eines Prozesses mit kill -9 die untergeordneten Prozesse im Speicher verbleiben und „verwaist“ werden. Dateisystem wird mit temporären Dateien verstopft, gemeinsam genutzte Speichersegmente sind aktiv, Sockets bleiben hängen und die Funktion atexit(3) wird überhaupt nicht ausgeführt. Dadurch besteht die Gefahr, dass unerwartete und schwer zu behebende Probleme auftreten.

Verwenden Sie stattdessen das Standard-TERM-Signal und KILL nur, wenn sich weniger problematische Signale als unwirksam erweisen:

$kill 6738
$ kill -INT 6738
$ kill -HUP 6738
$ kill -KILL 6738

Wenn selbst das KILL-Signal den Prozess nicht beendet, bleibt der Prozess wahrscheinlich bei der E/A hängen oder befindet sich in einem anderen nicht killbaren Zustand. Möglicherweise müssen Sie das fehlerhafte Netzlaufwerk neu starten oder die Bereitstellung erzwingen.

Die Verwendung des Standardkills -KILL ist akzeptabel, wenn es sich um eine problematische Anwendung handelt. Ältere Versionen von Netscape wurden beispielsweise häufig nur mit dem KILL-Signal beendet. Dies ist jedoch eine seltene Ausnahme von der Regel: Verwenden Sie KILL für diese bekannten Anwendungen und nur für diese.

Beim Beenden von Prozessen sind Probleme aufgetreten

Das aufeinanderfolgende Senden verschiedener Signale kann zu folgenden Problemen führen: Erstens kann es Sekunden oder sogar mehrere zehn Sekunden dauern, bis der Vorgang ordnungsgemäß beendet wird. Bei einem von mir verwendeten Produkt dauerte es über 30 Sekunden, bis es nach dem Empfang des TERM-Signals korrekt beendet wurde. Glücklicherweise wurde diese Funktion beim Testen entdeckt, sodass für diesen Fall ein geeignetes Skript geschrieben wurde. Zweitens gibt es manchmal Situationen, in denen ein alter Prozess beendet wurde, während ein neuer Prozess seine ID im Intervall zwischen den Signalen TERM und KILL übernommen hat. Besonders gefährdet sind Systeme mit hohem Prozessumsatz und Systeme, bei denen der Kernel PIDs zufällig zuweist, wie etwa OpenBSD. Die Überprüfung des Prozessnamens oder seiner PPID hilft nicht immer, da der neue Prozess ein Fork desselben übergeordneten Prozesses sein und denselben Namen haben könnte. Daher überprüfen besonders paranoide Skripte möglicherweise auch die Erstellungszeit des Prozesses oder andere Metadaten, bevor sie das Signal senden. Diese Situationen kommen vielleicht selten vor, aber es lohnt sich, sie zu berücksichtigen, wenn Sie mit einem kritischen Prozess zu tun haben.

Beendigungssignale verarbeiten

Prozessbeendigungssignale können anhand des Namens oder der Sequenznummer identifiziert werden: kill -1 und kill -HUP sind gleichwertig. Die Verwendung des Signalnamens ist jedoch sicherer, da die Angabe eines -1-Arguments leicht dazu führen kann, dass dieser falsch eingegeben wird und das Signal an einen anderen Prozess oder sogar eine Gruppe von Prozessen gesendet wird. Versuchen Sie außerdem immer, in Ihren Skripten einen Namen zu verwenden, da Sie so besser verstehen, welche Art von Signal an denjenigen gesendet wird, der Ihren Code liest.

Das HUP-Signal friert die Shell ein, also gute Möglichkeit Löschen Sie die Shell, die auf Eingaben wartet, oder schließen Sie die SSH-Sitzung.

Weitere Informationen zu Prozessbeendigungssignalen finden Sie unter

Signale sind Software-Interrupts. Sie werden für die Kommunikation zwischen Prozessen in UNIX und UNIX-ähnlichen Betriebssystemen wie Linux, Mac OS verwendet.

Signale werden seit Bell Labs UNIX im Jahr 1970 verwendet und sind nun offiziell durch den POSIX-Standard definiert. Wenn ein Prozess ein Signal empfängt, unterbricht das Betriebssystem den normalen Ausführungsfluss des Prozesses und sendet eine Benachrichtigung.

Egal welches Betriebssystem Sie werden zweifellos die Erfahrung machen, dass Ihre Anwendungen blockiert sind und nicht ordnungsgemäß funktionieren. Unter Unix und Linux gibt es einen „Kill“-Befehl, mit dem Sie den Prozess sofort beenden können, aber nicht nur das, ich werde etwas später darauf eingehen. In diesem Artikel „Kill Command unter Unix/Linux“ erkläre und zeige ich Ihnen, wie das geht vorgefertigte Beispiele verschiedene Befehle Töte Versorgungsunternehmen.

Töte Befehle und Signale

Wenn Sie den Kill-Befehl erteilen, senden Sie tatsächlich ein Signal an das System und weisen es an, die fehlerhafte Anwendung zu beenden. Es gibt insgesamt 60 Signale, die verwendet werden können, aber alles, was Sie wirklich wissen müssen, sind SIGTERM (15) und SIGKILL (9).

Sie können alle Signale mit dem folgenden Befehl anzeigen:

# kill -l

Auf meinem MacOS:

Ich werde versuchen, über alle Signale zu sprechen, aber zunächst werden wir nur über die wichtigsten und am häufigsten verwendeten sprechen.

Grundlegende Signale

Die folgenden Signale sind Teil POSIX-Standard. Jedes Signal ist ein in definiertes Makro System-Header-Datei. Sie werden normalerweise ohne ihr SIG-Präfix abgekürzt; Beispielsweise wird SIGHUP oft einfach als HUP bezeichnet.

SIGTERM– Dieses Signal fordert dazu auf, einen laufenden Prozess zu stoppen. Dieses Signal kann ignoriert werden. Dem Prozess wird Zeit gegeben, ordnungsgemäß herunterzufahren. Wenn ein Programm ordnungsgemäß beendet wird, bedeutet dies, dass ihm Zeit gegeben wurde, seinen Fortschritt wiederherzustellen und Ressourcen freizugeben. Mit anderen Worten: Es wurde nicht „erzwungen“, den Prozess zu beenden.

SIGKILL– Das SIGKILL-Signal bewirkt, dass der Prozess seine Arbeit sofort stoppt. Das Programm kann dieses Signal nicht ignorieren. Nicht gespeicherte Fortschritte gehen verloren.

Syntax für „kill“.

Die Befehlssyntax lautet:

# PID(s) töten

# kill [-s] [-l] %pid

Das Standardsignal (falls nicht angegeben) ist SIGTERM. Wenn dieses Signal nicht hilft und nicht funktioniert, können Sie die folgenden Optionen für „Kill“ verwenden, um den Prozess zwangsweise zu beenden:

# töte SIGKILL PID

# kill -9 PID

Dabei ist „-9“ das Flag, das sich auf das SIGKILL-Signal bezieht.

Wenn Sie nicht wissen, welche PID Sie für die Anwendung verwenden sollen, die Sie entfernen möchten, führen Sie den folgenden Befehl aus:

$ps -aux

Und wenn Sie eine bestimmte Anwendung kennen (z. B. Apache), können Sie das Unnötige aussortieren und alle Prozesse für diesen Dienst anzeigen:

$ ps -aux | grep Apache

Dadurch werden alle laufenden Anwendungen zusammen mit ihren PID(s) angezeigt.

Um beispielsweise eine Anwendung zu beenden, führe ich den folgenden Befehl aus:

# töten -9 3629

Es ist auch erwähnenswert, dass mehrere Prozesse gleichzeitig ausgeführt werden können, sodass sie „getötet“ werden können:

# kill -9 PID1 PID2 PID 3

Neu laden Konfigurationsdateien oder starten Sie die Dienstprogramme neu:

# kill -1 number_of_PID

Besonders nützliche Signale sind HUP, INT, kill, STOP, CONT und 0.

Die Optionen sind:

-s Signalname
Ein symbolischer Signalname, der das Signal zum Senden eines nicht standardmäßigen Signals angibt.

-l
Wenn der Operand nicht angegeben ist, werden die Signalnamen angezeigt. Andernfalls schreiben Sie den Namen des Signals, das exit_status entspricht.

-Signalname
Symbolischer Signalname, der das Signal angibt, das standardmäßig an TERM gesendet werden soll.

-signal_nummer
Eine nicht negative dezimale Ganzzahl, die das Standardsignal angibt, das an TERM gesendet werden soll.

Die folgenden PIDs haben eine besondere Bedeutung:
-1 Wenn es sich um einen Superuser handelt, wird das Signal an alle Prozesse gesendet. andernfalls sendet es an alle zugehörigen Prozesse.
ing für den Benutzer.

Einige der am häufigsten verwendeten Signale sind:

  • 1 HUP (auflegen) – auflegen.
  • 2 INT (Interrupt) – Unterbrechung.
  • 3 QUIT (beenden) – beenden.
  • 6 ABRT (Abbruch) – Unterbrechungen.
  • 9 KILL (nicht fangbarer, nicht zu ignorierender Kill)
  • 14 ALRM (Wecker) – Wecker.
  • 15 TERM (Software-Beendigungssignal) — Software um das Signal zu stoppen.

PKill

Mit dem Befehl „pkill“ können Sie erweiterte Muster regulärer Ausdrücke und andere Übereinstimmungskriterien verwenden. Anstatt die PID zu verwenden, können Sie die Anwendung jetzt beenden, indem Sie den Prozessnamen eingeben. Um beispielsweise den Firefox-Browser zu beenden, führen Sie einfach den folgenden Befehl aus:

#pkill Firefox

Weil es zum Muster passt regulären Ausdruck, können Sie auch einen Teil des Prozessnamens eingeben, etwa so:

#pkillfire

Um zu vermeiden, dass die falschen Prozesse „abgeschossen“ werden, können Sie „pgrep -l [Prozessname]“ ausführen, um geeignete Prozesse aufzulisten.

Der Befehl pkill verfügt über viele weitere Optionen. Wenn Sie beispielsweise die Option „-u“ angeben, können Sie einen Benutzernamen oder eine ID angeben. In diesem Beispiel senden wir das TERM-Signal an alle Prozesse, die dem Benutzer „nobody“ gehören:

# pkill -u niemand

Alle töten

Killall verwendet den Prozessnamen anstelle der PID und „tötet“ alle Instanzen des Prozesses mit demselben Namen. Wenn Sie beispielsweise mehrere Instanzen verwenden Firefox-Browser, Sie können sie alle mit dem folgenden Befehl töten:

#killall Firefox

In Gnome können Sie Nautilus mit dem folgenden Befehl neu starten:

#killallnautilus

xkill

Xkill ist grafisch„Töten“ Sie die Anwendung. Wenn Sie im Terminal „XKill“ eingeben, verwandelt sich der Mauszeiger sofort in ein „Kreuz“. Alles, was Sie tun müssen, ist, bei der betreffenden App auf „Kreuz“ zu drücken, und die App wird sofort beendet. Wenn Sie interessiert sind, können Sie eine Tastenkombination hinzufügen, um die XKill-Funktion zu aktivieren.

Andere verwendete Signale

SIGABRT

Dieses Signal sendet ein Signal an den Prozess, den Vorgang abzubrechen. ABRT richtet sich normalerweise an den Prozess selbst, wenn es die Funktion abort() der Programmiersprache C aufruft, um eine abnormale Beendigung zu signalisieren. Es kann jedoch wie jedes andere Signal von jedem Prozess aus gerichtet werden.

SIGALRM, SIGVTALRM und SIGPROF

Das ALRM-, VTALRM- und/oder PROF-Signal wird an einen Prozess gesendet, wenn ein durch einen Aufruf einer Alarmfunktion (z. B. Setitimer) angegebenes Zeitlimit abgelaufen ist.

ALRM

Wird gesendet, wenn die aktuelle Zeit oder Uhr vergeht.

VTALRM

Wird gesendet, wenn die von einem Prozess verwendete CPU-Zeit abgelaufen ist.

PROF

Wird gesendet, wenn die von einem Prozess und dem System im Namen des Prozesses genutzte CPU-Zeit abläuft.

SIGBUS

Ein BUS-Signal wird an einen Prozess gesendet, wenn dieser zu einem Busfehler führt. Bedingungen, die zu diesem Signal führen, z. B. eine Fehlausrichtung des Speicherzugriffs oder eine fehlende physische Adresse.

SIGCHLD

Das CHLD-Signal wird an einen Prozess gesendet, wenn ein untergeordneter Prozess beendet wird, unterbrochen wird oder nach einer Unterbrechung wieder aufgenommen wird. Eine häufige Verwendung eines Signals besteht darin, dem Betriebssystem zu signalisieren, Ressourcen zu bereinigen, die von einem untergeordneten Prozess nach dessen Ende verwendet werden, ohne dass ein expliziter Systemaufruf erforderlich ist.

SIGCONT

Das CONT-Signal weist das Betriebssystem an, einen Prozess neu zu starten, der zuvor durch das STOP- oder TSTP-Signal angehalten wurde. Eines der wichtigen Merkmale dieses Signals ist die Steuerung des Betriebs in der Unix-Shell.

SIGFPE

Das FPE-Signal wird an einen Prozess gesendet, wenn dieser fehlerhafte arithmetische Operationen ausführt, beispielsweise eine Division durch Null.

SEUFZEND

Das HUP-Signal wird an einen Prozess gesendet, wenn sein Steuerterminal geschlossen ist. Es wurde ursprünglich entwickelt, um einen Prozess nach aufeinanderfolgenden Zeilenabbrüchen zu benachrichtigen (HUP ist für Hänge verantwortlich). IN moderne Systeme, bedeutet dieses Signal normalerweise, dass die Pseudo- oder virtuelle Terminalsteuerung geschlossen wurde.

SIGILL

ILL-Signal, das an einen Prozess gesendet wird, wenn dieser versucht, böswillige, unbekannte oder privilegierte Befehle (Anweisungen) auszuführen.

SIGNIEREN

Das INT-Signal wird vom Steuerterminal an einen Prozess gesendet, wenn der Benutzer den Prozess beenden möchte. Dies wird normalerweise durch Drücken von Strg-C eingeleitet, auf einigen Systemen jedoch auch durch „Löschen“ oder „Unterbrechen“.

SIGKILL

Das KILL-Signal wird an einen Prozess gesendet, um die Ausführung sofort zu stoppen. Im Gegensatz zu SIGTERM und SIGINT kann dieses Signal nicht erfasst oder ignoriert werden, und der Empfangsprozess kann nach dem Empfang dieses Signals keine Bereinigung durchführen.

SIGPIPE

Das PIPE-Signal wird an einen Prozess gesendet, wenn dieser versucht, in eine Pipe zu schreiben, ohne dass am anderen Ende ein Prozess angeschlossen ist.

SIGQUIT

Das QUIT-Signal wird von seinem steuernden Terminal an einen Prozess gesendet, wenn der Benutzer den Prozess auffordert, einen Speicherauszug durchzuführen.

SIGSEGV

Das SEGV-Signal wird an einen Prozess gesendet, wenn er eine ungültige Referenz auf den virtuellen Speicher oder einen Segmentierungsfehler macht, d. h. wenn er eine Segmentierungsverletzung durchführt.

SIGSTOP

Das STOP-Signal weist das Betriebssystem an, den Prozess zu stoppen, damit er später fortgesetzt werden kann.

SIGTERM

Das TERM-Signal wird an einen Prozess gesendet, um dessen Beendigung anzufordern. Im Gegensatz zum „Kill“-Signal kann es während des Prozesses interpretiert oder ignoriert werden. Dadurch kann der Prozess eine „schöne“ Ausführung durchführen, um die Freigabe von Ressourcen zu stoppen und bei Bedarf den Status zu speichern. Es ist zu beachten, dass SIGINT nahezu identisch mit SIGTERM ist.

SIGTSTP

Das TSTP-Signal wird an seinen Steuerterminalprozess gesendet und weist ihn an, vorübergehend anzuhalten. Dies wird normalerweise dadurch eingeleitet, dass der Benutzer Strg-Z drückt. Im Gegensatz zu SIGSTOP kann dieser Prozess einen Signalhandler registrieren oder das Signal ignorieren.

SIGTTIN und SIGTTOU

Die TTIN- und TTOU-Signale werden an einen Prozess gesendet, wenn dieser versucht, von einem (tty)-Terminal im Hintergrund zu lesen bzw. zu schreiben. Dieses Signal kann in der Regel nur durch kontrollierte Prozesse gewonnen werden Arbeitsplatte; Dämonen haben keine Steuerterminals und sollten dieses Signal niemals empfangen.

SIGUSR1 und SIGUSR2

Die Signale USR1 und USR2 werden an den Prozess gesendet und zeigen benutzerdefinierte Bedingungen an.

SIGPOL

Das POLL-Signal wird an einen Prozess gesendet, wenn ein asynchrones E/A-Ereignis auftritt.

SIGSYS

Das SYS-Signal wird an einen Prozess gesendet, wenn dieser ein fehlerhaftes Argument an einen Systemaufruf übergibt.

SIGTRAP

Ein TRAP-Signal wird an einen Prozess gesendet, wenn eine Bedingung eintritt, über die der Debugger informiert werden möchte – beispielsweise wenn eine bestimmte Funktion ausgeführt wird oder wenn sich ein bestimmter Wert einer Variablen ändert.

SIGURG

Das URG-Signal wird an einen Prozess gesendet, wenn im Socket dringende Daten oder Daten außerhalb des zulässigen Bereichs zum Lesen verfügbar sind.

SIGXCPU

Das XCPU-Signal wird an einen Prozess gesendet, wenn dieser die CPU länger als einen bestimmten, vom Benutzer festgelegten Sollwert nutzt. Das Eintreffen des XCPU-Signals stellt sicher, dass der Prozess alle Zwischenergebnisse schnell speichert und beendet, lange bevor er vom Betriebssystem mit dem SIGKILL-Signal beendet wird.

SIGXFSZ

Das XFSZ-Signal wird dabei gesendet, wenn eine Datei größer wird (einen angegebenen Wert überschreitet) als der maximal zulässige Wert.

SIGRTMIN zu SIGRTMAX

Die RTMIN-RTMAX-Signale sind für den Einsatz für kundenspezifische Zwecke vorgesehen. Es handelt sich um Echtzeitsignale.

Verschiedene Signale

Die folgenden Signale sind von POSIX nicht standardisiert, werden aber manchmal auf einigen Systemen verwendet.

SIGEMT

Das EMT-Signal wird prozessintern gesendet, wenn ein Emulator-Interrupt auftritt.

SIGINFO

Das INFO-Signal wird gesendet, wenn eine Statusanfrage vom Steuerterminal empfangen wird.

SIGPWR

Das PWR-Signal wird gesendet, wenn im System ein Stromausfall auftritt.

SIGLOST

Das LOST-Signal wird an einen Prozess gesendet, wenn eine „Dateisperre“ verloren geht.

SIGWINCH

Das WINCH-Signal wird an einen Prozess gesendet, wenn sein Steuerterminal seine Größe ändert.

Senden von Signalen von der Tastatur

Signale können von der Tastatur gesendet werden. Nachfolgend sind mehrere Standardwerte aufgeführt. Standardmäßig können die Tastaturkürzel zum Senden von Interrupt-Signalen mit dem Befehl stty definiert werden.

STRG-C

SIGINT senden (unterbrechen). Standardmäßig führt dies dazu, dass der Prozess beendet wird.

STRG-Z

SIGTSTP senden (Suspend). Dies führt standardmäßig dazu, dass der Prozess alle Vorgänge anhält.

STRG-\

Senden Sie SIGQUIT (Beenden). Standardmäßig führt dies dazu, dass der Prozess sofort beendet wird und der Kernel zurückgesetzt wird.

STRG-T

SIGINFO (INFO) senden. Dies führt standardmäßig dazu, dass das Betriebssystem Informationen über den Befehl anzeigt. Nicht auf allen Systemen unterstützt.

Abschluss

Wenn sich Anwendungen schlecht verhalten und dazu führen, dass das System einfriert, ist die Versuchung groß, den Computer neu zu starten und die Sitzung von vorne zu beginnen. Mit diesen „Kill“-Befehlen können Sie schlechtes Verhalten von Anwendungen, die einen Systemabsturz verursachen oder verursachen könnten, besser verwalten. Damit schließe ich dieses Thema „Der Kill-Befehl unter Unix/Linux“ ab.

Wie dem auch sei, früher oder später stehen wir vor der Notwendigkeit, einen fehlerhaften oder hängengebliebenen Prozess zu beenden Linux. Ja, ja, einige Anwendungen unter Linux frieren manchmal trotz ihrer Stabilität ein. In diesen Fällen erweist sich ein wunderbares Dienstprogramm als nützlich Töten. Lassen Sie uns herausfinden, wie Sie dieses Dienstprogramm verwenden.

Jeder Prozess in Linux hat einen eigenen Bezeichner namens PID. Bevor Sie einen Prozess stoppen, müssen Sie ihn definieren PID. Die Quintessenz ist, dass wir diesen Bezeichner finden müssen. Öffnen wir beispielsweise ein beliebiges Programm und versuchen, seinen Bezeichner zu finden.

Prozess-ID ist hängengeblieben

Zum Suchen benötigen wir Befehle ps und grep. Team PS- zeigt uns eine Liste der aktiven Prozesse im System und Informationen darüber sowie den Befehl an grep- Durchsucht die Ergebnisse des Befehls PS. Öffnen wir also ein Terminal ( Strg+Alt+T) und schauen Sie sich die aktiven Prozesse an

P.S. axu

Wie Sie bereits bemerkt haben, ist die Liste sehr umfangreich und es ist Zeitverschwendung, darin zu scrollen, um den von uns benötigten Prozess zu finden. Dafür werden wir ein wunderbares Programm verwenden grep. Um den von uns benötigten Prozess zu finden, geben Sie nach der Eingabe von grep die gesuchte Anwendung an. Am Beispiel von Viber sieht es so aus:

p.s. | grep viber pol 22685 0,0 1,9 647748 76620 ? Sl 13:01 0:04 /usr/bin/python /usr/bin/viberwrapper-indicator pol 22697 3,0 5,4 5402084 216120 ? Sl 13:01 4:52 /opt/viber/Viber pol 24068 0,0 0,0 17192 2216 pts/0 S+ 15:41 0:00 grep --color=auto viber

In der ersten Zeile laufende Anwendung viberwrapper-indicator, Sie können mehr über diese Anwendung lesen. Die zweite Zeile ist Viber selbst, den wir heute „auslöschen“ werden, aber was ist die dritte Zeile? Der dritte Prozess ist der Prozess selbst grep, da wir das Wort viber als Suchparameter angegeben haben und sich grep in der Befehlsausgabe wiederfand PS.

Es gibt einen anderen, einfacheren Weg, das herauszufinden PID Prozess ist ein Befehl pidof, der den Prozessnamen als Parameter übernimmt und seine PID ausgibt. Achten Sie auf die Groß-/Kleinschreibung: Wenn der Prozessname mit einem Großbuchstaben beginnt und Sie ihn mit einem Kleinbuchstaben schreiben (oder umgekehrt), ist pidof nicht vorhanden

pidof Viber

Wie Sie bereits bemerkt haben, wurden mir bei der aktiven Viber-Anwendung 3 Zeilen angezeigt

Abschluss des Prozesses oder, einfacher ausgedrückt, „Mord“

Jetzt kennen wir die Viber-Prozess-ID und haben die Möglichkeit, sie zu „killen“:

töte 22697

Im Allgemeinen soll der Kill-Befehl ein Signal an einen Prozess senden. Wenn wir keine Attribute angeben, wird standardmäßig das SIGTERM-Signal (von der Wortbeendigung) gesendet. SIGTERM weist den Prozess an, zu beenden. Jedes Signal hat eine eigene Nummer. SIGTERM hat die Nummer 15. Eine Liste aller Signale (und ihrer Nummern), die der Befehl senden kann töten, kann durch Ausführen abgeleitet werden töte -l. Um das SIGKILL-Signal (Nummer 9) an Prozess 22697 zu senden, führen Sie in der Befehlszeile Folgendes aus:

töten -9 22697

Das SIGTERM-Signal stoppt den Prozess möglicherweise nicht (z. B. wenn das Signal abgefangen oder blockiert wird), aber SIGKILL beendet den Prozess immer, da es nicht abgefangen oder ignoriert werden kann.
Suchen volle Liste Attribute können durch Ausführen des Befehls ausgeführt werden

töte -l

Aufgaben und Prozesse

Alles, was in durchgeführt wurde Linux-Programm angerufen Verfahren. Linux als Multitasking-System zeichnet sich dadurch aus, dass viele Prozesse eines oder mehrerer Benutzer gleichzeitig ausgeführt werden können. Mit dem Befehl können Sie eine Liste der aktuell laufenden Prozesse anzeigen PS, zum Beispiel wie folgt:

/home/larry# ps PID TT STAT TIME COMMAND 24 3 S 0:03 (bash) 161 3 R 0:00 ps /home/larry#

Bitte beachten Sie, dass standardmäßig der Befehl PS Zeigt eine Liste nur der Prozesse an, die dem Benutzer gehören, der sie gestartet hat. Um alle im System laufenden Prozesse anzuzeigen, müssen Sie den Befehl ausführen ps -a . Prozessnummern(Prozess-ID oder PID), die in der ersten Spalte aufgeführt sind, sind eindeutige Nummern, die das System jedem laufenden Prozess zuweist. Die letzte Spalte mit der Überschrift BEFEHL gibt den Namen des ausgeführten Befehls an. In diesem Fall enthält die Liste Prozesse, die vom Benutzer Larry selbst gestartet wurden. Es gibt viele andere Prozesse, die im System ausgeführt werden; ihre vollständige Liste kann mit dem Befehl angezeigt werden ps-aux. Allerdings gibt es unter den von Benutzer Larry ausgeführten Befehlen nur Bash (die Befehls-Shell für Benutzer Larry) und den Befehl selbst PS. Es ist zu sehen, dass die Bash-Shell gleichzeitig mit dem Befehl ausgeführt wird PS. Als der Benutzer den Befehl eingegeben hat PS, die Bash-Shell hat mit der Ausführung begonnen. Nach dem Team PS seine Arbeit beendet hat (die Prozesstabelle wird angezeigt), kehrt die Kontrolle zum Bash-Prozess zurück. Anschließend zeigt die Bash-Shell eine Eingabeaufforderung an und wartet auf einen neuen Befehl.

Ein laufender Prozess wird auch aufgerufen Aufgabe(Arbeit). Die Begriffe Prozess und Aufgabe werden synonym verwendet. Normalerweise wird ein Prozess jedoch als Aufgabe bezeichnet, wenn er bedeutet Jobmanagement(Arbeitskontrolle). Die Jobsteuerung ist eine Befehlsshellfunktion, die dem Benutzer die Möglichkeit gibt, zwischen mehreren Jobs zu wechseln.

In den meisten Fällen führen Benutzer nur eine Aufgabe aus – dies ist der letzte Befehl, den sie in die Befehlsshell eingegeben haben. Viele Shells (einschließlich Bash und tcsh) verfügen jedoch über Funktionen Jobmanagement(Jobsteuerung), mit der Sie mehrere Befehle gleichzeitig ausführen können oder Aufgaben(Jobs) auswählen und bei Bedarf zwischen ihnen wechseln.

Die Auftragsverwaltung kann hilfreich sein, wenn Sie beispielsweise einen großen Auftrag bearbeiten Textdatei und möchten die Bearbeitung vorübergehend unterbrechen, um einen anderen Vorgang auszuführen. Mithilfe der Jobverwaltungsfunktionen können Sie den Editor vorübergehend verlassen, zur Shell-Eingabeaufforderung zurückkehren und andere Aktionen ausführen. Wenn sie fertig sind, können Sie wieder mit dem Editor arbeiten und ihn in demselben Zustand vorfinden, in dem er belassen wurde. Es gibt viele weitere nützliche Einsatzmöglichkeiten für Jobverwaltungsfunktionen.

Vordergrund- und Hintergrundmodus

Aufgaben können beides sein Vordergrund(Vordergrund), oder Hintergrund(Hintergrund). Es kann immer nur eine Aufgabe im Vordergrund sein. Die Vordergrundaufgabe ist die Aufgabe, mit der Sie interagieren. Es empfängt Eingaben von der Tastatur und sendet Ausgaben an den Bildschirm (es sei denn, Sie haben die Eingabe oder Ausgabe natürlich an eine andere Stelle umgeleitet). Gegen, Hintergrundjobs keine Eingaben vom Terminal erhalten; Normalerweise erfordern solche Jobs keine Benutzerinteraktion.

Manche Aufgaben dauern sehr lange und es passiert nichts Interessantes, während sie ausgeführt werden. Ein Beispiel für solche Aufgaben ist das Kompilieren und Kompilieren von Programmen große Dateien. Es gibt keinen Grund, auf den Bildschirm zu starren und darauf zu warten, dass diese Aufgaben abgeschlossen sind. Solche Jobs sollten im Hintergrund ausgeführt werden. Während dieser Zeit können Sie mit anderen Programmen arbeiten.

Um die Ausführung von Prozessen in Linux zu steuern, wird ein Übertragungsmechanismus bereitgestellt Signale. Ein Signal ist die Fähigkeit von Prozessen, Standardkurznachrichten direkt über das System auszutauschen. Die Signalnachricht enthält außer der Signalnummer keine Informationen (der Einfachheit halber kann anstelle einer Nummer auch ein vom System vordefinierter Name verwendet werden). Um ein Signal zu übertragen, muss ein Prozess lediglich einen Systemaufruf verwenden töten(), und um das Signal zu empfangen, brauchen Sie nichts. Wenn ein Prozess auf eine besondere Art und Weise auf ein Signal reagieren muss, kann er dies registrieren Handler, und wenn kein Handler vorhanden ist, reagiert das System darauf. Normalerweise führt dies dazu, dass der Prozess, der das Signal empfangen hat, sofort beendet wird. Der Signalhandler startet asynchron, sofort nach Empfang des Signals, unabhängig davon, was der Prozess gerade tut.

Zwei Signale - Nummer 9 ( TÖTEN) und 19 ( STOPPEN) – wird immer vom System verarbeitet. Der erste von ihnen wird benötigt, um den Prozess sicher abzubrechen (daher der Name). Signal STOPPEN suspendiert Prozess: In diesem Zustand wird der Prozess nicht aus der Prozesstabelle entfernt, sondern erst ausgeführt, wenn er das Signal 18 empfängt ( WEITER) - danach funktioniert es weiter. In der Linux-Befehlsshell das Signal STOPPEN kann über eine Escape-Sequenz an den aktiven Prozess übergeben werden Strg -Z .

Signalnummer 15 ( BEGRIFF) dient zur Arbeitsunterbrechung. Bei Unterbrechung(Unterbrechungs-)Jobprozess stirbt ab. Jobs werden normalerweise durch eine Escape-Sequenz unterbrochen Strg -C. Es gibt keine Möglichkeit, einen unterbrochenen Job wiederherzustellen. Sie sollten sich auch darüber im Klaren sein, dass einige Programme das Signal abfangen BEGRIFF(mithilfe eines Handlers), sodass das Drücken einer Tastenkombination erfolgt Strg -C(o) darf den Vorgang nicht sofort abbrechen. Dies geschieht, damit das Programm Spuren seiner Arbeit vernichten kann, bevor sie abgeschlossen ist. In der Praxis können manche Programme auf diese Weise überhaupt nicht unterbrochen werden.

In den Hintergrund treten und Arbeitsplätze vernichten

Lass uns beginnen mit einfaches Beispiel. Schauen wir uns den Ja-Befehl an, der auf den ersten Blick nutzlos erscheinen mag. Dieser Befehl sendet einen endlosen Strom von Zeichenfolgen, bestehend aus dem Zeichen y, an die Standardausgabe. Sehen wir uns an, wie dieser Befehl funktioniert:

/home/larry# ja y y y y

Die Abfolge solcher Zeilen wird auf unbestimmte Zeit fortgesetzt. Sie können diesen Vorgang zerstören, indem Sie ihm ein Unterbrechungssignal senden, also drücken Strg -C. Lasst uns die Dinge jetzt anders machen. Um zu verhindern, dass diese endlose Sequenz auf dem Bildschirm angezeigt wird, leiten wir die Standardausgabe des Befehls „yes“ nach /dev/null um. Wie Sie vielleicht wissen, fungiert das /dev/null-Gerät als „Schwarzes Loch“: Alle an dieses Gerät gesendeten Daten gehen verloren. Mit diesem Gerät ist es sehr praktisch, zu viel Ausgabe einiger Programme loszuwerden.

/home/larry# ja > /dev/null

Jetzt wird nichts mehr auf dem Bildschirm angezeigt. Allerdings wird auch der Shell-Prompt nicht zurückgegeben. Dies liegt daran, dass der Befehl „yes“ immer noch ausgeführt wird und seine Nachrichten bestehend aus den Buchstaben „y“ an /dev/null sendet. Sie können diese Aufgabe auch zerstören, indem Sie ihr ein Interrupt-Signal senden.

Nehmen wir nun an, Sie möchten, dass der Befehl „yes“ weiterhin funktioniert, aber auch die Shell-Eingabeaufforderung wieder auf dem Bildschirm angezeigt wird, damit Sie mit anderen Programmen arbeiten können. Dazu können Sie den Befehl „yes“ in übersetzen Hintergrundmodus, und sie wird dort arbeiten, ohne mit Ihnen zu kommunizieren.

Eine Möglichkeit, einen Prozess in den Hintergrund zu versetzen, besteht darin, am Ende des Befehls ein & anzuhängen. Beispiel:

/home/larry# ja > /dev/null & + 164 /home/larry#

Die Botschaft ist Auftragsnummer(Auftragsnummer) für den Prozess ja. Die Befehlsshell weist jedem ausgeführten Job eine Jobnummer zu. Da „yes“ der einzige ausführbare Job ist, wird ihm die Nummer 1 zugewiesen. Die Nummer 164 ist die diesem Prozess zugeordnete Identifikationsnummer (PID), und diese Nummer wird dem Prozess auch vom System zugewiesen. Wie wir später sehen werden, kann auf einen Prozess durch Angabe dieser beiden Nummern zugegriffen werden.

Jetzt läuft im Hintergrund ein Ja-Prozess, der kontinuierlich einen Strom von Y an das /dev/null-Gerät sendet. Um den Status dieses Prozesses herauszufinden, müssen Sie den Befehl ausführen Arbeitsplätze, ein Shell-interner Befehl.

/home/larry# jobs + Ausführen ja >/dev/null & /home/larry#

Wir sehen, dass dieses Programm wirklich funktioniert. Um den Status einer Aufgabe herauszufinden, können Sie auch den Befehl verwenden PS, wie oben gezeigt.

Um ein Signal an den Prozess zu übertragen (meistens besteht ein Bedarf). unterbrechen job job) wird das Dienstprogramm verwendet töten. Als Argument wird diesem Befehl entweder eine Jobnummer oder eine PID übergeben. Ein optionaler Parameter ist die Nummer des Signals, das an den Prozess gesendet werden muss. Standardmäßig wird das Signal gesendet BEGRIFF. Im obigen Fall war die Jobnummer 1, also der Befehl töte %1 wird den Job unterbrechen. Wenn auf einen Job über seine Nummer (und nicht über seine PID) zugegriffen wird, dann vor dieser Nummer in Befehlszeile Sie müssen das Prozentzeichen („%“) eingeben.

Geben wir nun den Befehl ein Arbeitsplätze erneut, um das Ergebnis der vorherigen Aktion zu überprüfen:

/home/larry# jobs Beendet ja >/dev/null

Tatsächlich wird der Job zerstört und bei der nächsten Eingabe des Jobs-Befehls werden keine Informationen darüber auf dem Bildschirm angezeigt.

Sie können einen Job auch mithilfe der Prozessidentifikationsnummer (PID) beenden. Diese Nummer wird zusammen mit der Job-Identifikationsnummer beim Start des Jobs angezeigt. In unserem Beispiel war der PID-Wert 164, also der Befehl töte 164 würde dem Befehl entsprechen töte %1. Wenn Sie PID als Argument für den Kill-Befehl verwenden, müssen Sie das Zeichen „%“ nicht eingeben.

Unterbrechen und Fortsetzen von Aufträgen

Starten wir den Vorgang zunächst wie zuvor mit dem Befehl „yes“ im Vordergrund:

/home/larry# ja > /dev/null

Da der Prozess wie zuvor im Vordergrund ausgeführt wird, kehrt die Shell-Eingabeaufforderung nicht zum Bildschirm zurück.

Jetzt müssen Sie die Aufgabe nicht mehr mit einer Tastenkombination unterbrechen Strg -C, die Aufgabe ist möglich aussetzen(wörtlich suspendieren – suspendieren) und ihm ein Signal sendet STOPPEN. Um eine Aufgabe anzuhalten, müssen Sie die entsprechende Tastenkombination drücken, normalerweise diese Strg -Z .

/home/larry# ja > /dev/null Strg -Z+ Gestoppt ja >/dev/null /home/larry#

Der angehaltene Prozess wird einfach nicht ausgeführt. Es verbraucht keine Prozessorressourcen. Die Ausführung einer angehaltenen Aufgabe kann an derselben Stelle gestartet werden, an der sie nicht angehalten worden wäre.

Um den im Vordergrund laufenden Job fortzusetzen, können Sie den Befehl verwenden fg(vom Wort Vordergrund - Vordergrund).

/home/larry# fg ja >/dev/null

Die Befehlsshell zeigt erneut den Befehlsnamen an, sodass der Benutzer weiß, in welcher Aufgabe er sich befindet. dieser Moment im Vordergrund gestartet. Lassen Sie uns diese Aufgabe erneut anhalten, indem wir die Tasten drücken Strg -Z, aber dieses Mal starten wir es mit dem Befehl im Hintergrund bg(vom Wort Hintergrund - Hintergrund). Dadurch wird der Prozess so ausgeführt, als ob er mit einem Befehl mit einem & am Ende ausgeführt worden wäre (wie im vorherigen Abschnitt geschehen):

/home/larry# bg + ja $>$/dev/null & /home/larry#

Der Shell-Prompt wird zurückgegeben. Jetzt das Team Arbeitsplätze Muss zeigen, dass der Prozess Ja funktioniert im Moment tatsächlich; Dieser Prozess kann mit dem Befehl abgebrochen werden töten, wie es schon früher gemacht wurde.

Sie können die Tastenkombination nicht verwenden, um eine im Hintergrund laufende Aufgabe anzuhalten Strg -Z. Bevor ein Job angehalten wird, muss er mit dem Befehl in den Vordergrund gebracht werden fg und erst dann aufhören. Daher der Befehl fg kann entweder auf angehaltene Jobs oder auf einen Job angewendet werden, der im Hintergrund ausgeführt wird.

Es gibt einen großen Unterschied zwischen Hintergrundjobs und suspendierten Jobs. Ein angehaltener Job wird nicht ausgeführt – er verbraucht keine Prozessorleistung. Dieser Job führt keine Aktion aus. Eine angehaltene Aufgabe belegt eine bestimmte Menge an Computer-RAM; nach einiger Zeit pumpt der Kernel diesen Teil des Speichers dorthin Festplatte « postlagernd" Im Gegensatz dazu wird ein Hintergrundjob ausgeführt, der Speicher beansprucht und einige Dinge ausführt, die Sie vielleicht tun möchten, aber Sie arbeiten möglicherweise gleichzeitig an anderen Programmen.

Im Hintergrund ausgeführte Jobs versuchen möglicherweise, Text auf dem Bildschirm anzuzeigen. Dies beeinträchtigt die Arbeit an anderen Aufgaben.

/home/larry# ja &

Hier wurde die Standardausgabe nicht auf das /dev/null-Gerät umgeleitet, sodass ein endloser Strom von y Zeichen auf dem Bildschirm gedruckt wird. Dieser Thread kann aufgrund der Tastenkombination nicht gestoppt werden Strg -C hat keinen Einfluss auf Jobs im Hintergrund. Um diese Ausgabe zu stoppen, müssen Sie den Befehl verwenden fg, wodurch die Aufgabe in den Vordergrund gerückt und dann mit einer Tastenkombination zerstört wird Strg -C .

Lassen Sie uns noch eine Bemerkung machen. Normalerweise pro Team fg und das Team bg wirken sich auf die Jobs aus, die zuletzt ausgesetzt wurden (diese Jobs werden mit einem +-Symbol neben der Jobnummer markiert, wenn Sie den Befehl eingeben). Arbeitsplätze). Wenn ein oder mehrere Jobs gleichzeitig laufen, können Jobs durch die Angabe von Befehlen als Argumente in den Vordergrund oder Hintergrund gestellt werden fg oder Befehle bg ihre Identifikationsnummer (Job-ID). Zum Beispiel der Befehl fg %2 stellt Jobnummer 2 und den Befehl in den Vordergrund bg %3 stellt Job Nummer 3 in den Hintergrund. Verwenden Sie PIDs als Befehlsargumente fg Und bg es ist verboten.

Um einen Job in den Vordergrund zu holen, können Sie außerdem einfach seine Nummer angeben. Ja, Team %2 entspricht dem Befehl fg %2 .

Es ist wichtig zu bedenken, dass die Jobkontrollfunktion zur Shell gehört. Mannschaften fg , bg Und Arbeitsplätze Sind interne Teams Muscheln. Wenn Sie aus irgendeinem Grund eine Befehlsshell verwenden, die keine Jobverwaltungsfunktionen unterstützt, werden Sie diese (und ähnliche) Befehle darin nicht finden.



Freunden erzählen