Historisch gesehen waren drei Signale an Tastenanschläge gebunden
- SIGINT (Interrupt) normalerweise Ctrl+ CoderDel
- SIGQUIT - Quit - Normalerweise an Ctrl+ gebunden\
- SIGSUSP Suspend - Normalerweise an Ctrl+ gebundenZ
Bei einigen * nix-Varianten sind auch andere Signale gebunden. Sie können die Tastaturbindungen mit dem Befehl überprüfen
stty -a
Auf meinem System OS / X erzeugt dies die folgende Ausgabe
speed 9600 baud; 65 rows; 213 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
-echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
-extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8
-ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
-dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
stop = ^S; susp = ^Z; time = 0; werase = ^W;
Bitte beachten Sie, dass Kill in diesem Fall kein KILL-Signal ist, sondern das Löschen des aktuellen Eingangspuffers.
Möglicherweise haben Sie mehr Erfolg beim Stoppen von Prozessen mit SIGQUIT. Dies ist jedoch möglicherweise nicht der Fall, da der Prozess das Signal möglicherweise abfängt und ignoriert.
Es gibt kein Konzept für eine Liste von "unterbrochenen" Prozessen, da der Prozess den Interrupt entweder abgefangen und ignoriert hat oder beendet wurde. Sie können eine Liste angehaltener Prozesse abrufen, indem Sie Jobs eingeben
stty -ixon
, dass sie durchlaufen werden. Ich würde denken, dass sie sich ändern würden<undef>
.Viele richtige Antworten, aber keine, die vollständig sind.
Um mit extremen Vorurteilen zu beenden und ohne zuzulassen, dass der Prozess gestoppt wird, verwenden Sie SIGKILL, das standardmäßig nicht an einen Schlüssel gebunden ist. Stattdessen senden Sie es normalerweise mit dem
kill (1)
Befehl und geben das zu sendende Signal wie in anoder mnemonisch
Dieses Signal wird direkt vom Betriebssystem verarbeitet und das Programm kann das Standardverhalten nicht überschreiben.
Wenn Ihre Shell die Jobsteuerung unterstützt, unterstützt sie möglicherweise auch eine integrierte Version,
kill
die die Jobidentifizierung mithilfe des%
Zeichens wie in der Antwort von Catwalk unterstützt .fg
die Kontrolle über das Terminal behalten oderbg
es ausführen, ohne die Kontrolle über das Terminal zu behalten (aber standardmäßig immer noch seine Ausgabe dorthin senden).quelle
um eine Liste der Hintergrundprozesse zu sehen:
jobs
zu töten:
kill %1
(1 durch entsprechende Job-ID wie in derjobs
Ausgabe ersetzen )quelle
Strg-C sendet SIGINT, wodurch ein Prozess standardmäßig beendet wird, aber abgefangen werden kann (in
\bin sh
, usingtrap
).SIGKILL ist das nicht einfangbare Kill-Signal.
Beim dritten Mal denke ich, dass dies richtig ist: Ich habe alles anhand der Dokumente überprüft. Wir werden sehen.
quelle
Dies ist den meisten Terminal-Neulingen nicht klar, aber wenn Ihr Problem nur darin besteht, dass Sie sich in einem interaktiven Programm befinden und nicht herausfinden können, wie Sie aussteigen sollen, wird es häufig beendet
q
. Dies ist beispielsweise der Schlüssel zum Beenden. Dies ist unter anderemless
auch das Programm, das Sie beim Anzeigen vonman
Seiten erhalten.Einige Programme verfügen über andere Tastaturkürzel zum Beenden. In
vim
odervi
verwendenESC:wq
. Inemacs
verwendenControl-C Control-X
. Innano
oderpico
verwendenControl-X
. Beachten Sie, dass es in diesen Beispielen insbesondere Feinheiten gibt, ob diese Verknüpfungen Änderungen speichern, die Sie möglicherweise an der zu bearbeitenden Datei vorgenommen haben.quelle
Viele Prozesse können einen Interrupt-Handler installieren, um das Interrupt-Signal abzufangen, aber diejenigen, die nicht standardmäßig abgebrochen werden.
Um das Beenden eines Prozesses zu erzwingen, können Sie SIGQUIT (Ctrl- \) senden.
quelle
Es scheint, dass die anderen Antworten das wahrscheinliche Szenario sind, aber es ist auch möglich, dass Sie ein Skript ausführen, das seine untergeordneten Elemente nicht richtig behandelt. Ich bin kürzlich auf ein ähnliches Szenario gestoßen, in dem das Beenden eines Skripts die untergeordneten Prozesse dieses Skripts nicht beendet.
Wenn Sie in diese Situation geraten, müssen Sie im Allgemeinen alle von Ihnen ausgeführten Prozesse überprüfen. Sie sollten die Manpage für ps überprüfen. (
man ps
) Ich benutze besonders gerneps auxwf
, was die Eltern-Kind-Beziehung zwischen Prozessen zeigt.pstree
macht etwas ähnliches. Sie sollten dies von einem anderen Terminal aus ausführen, bevor Sie den Prozess beenden, um zu sehen, wie die Dinge in der normalen Situation aussehen, und die untergeordneten Prozesse identifizieren.Wenn Sie diesen Hauptprozess dann (mit ^ C) beenden, überprüfen Sie die Ausgabe von ps erneut, um festzustellen, ob sich etwas geändert hat. Wenn die untergeordneten Prozesse noch vorhanden sind, können Sie sie mit dem
kill
Befehl beenden. (sieheman kill
)quelle