Was ist der Unterschied zwischen Strg + Z und Strg + C in der Unix-Befehlszeile?

188

Ich verwende Mac OS X Terminal. Und ich benutze Ctrl+ Zoder Ctrl+ C, um einige Programme zu stoppen. Aber mir wurde klar, dass ich nicht genau weiß, was sie tun. Was sind sie und was ist der Unterschied zwischen ihnen?

Diese Frage war eine Super User Frage der Woche .
Lesen Sie den Blog-Eintrag vom 13. März 2011, um weitere Informationen zu erhalten, oder reichen Sie Ihre eigene Frage der Woche ein.

Eonil
quelle

Antworten:

250

Control+ Zwird zum Unterbrechen eines Prozesses verwendet, indem das Signal gesendet wird SIGSTOP, das vom Programm nicht abgefangen werden kann. While Control+ Cwird verwendet, um einen Prozess mit dem Signal SIGINTzu beenden. Es kann von einem Programm abgefangen werden, damit es sich vor dem Beenden selbst bereinigen oder gar nicht beenden kann.

Wenn Sie einen Prozess anhalten, wird dies in der Shell angezeigt, um Ihnen mitzuteilen, dass er angehalten wurde:

[1]+  Stopped                 yes

Wenn Sie jedoch eine beenden, wird nur eine Bestätigung angezeigt, die an eine Shell-Eingabeaufforderung zurückgegeben wird. Wenn Sie einen Prozess anhalten, können Sie auch damit etwas Besonderes anfangen. Zum Beispiel:

fg

Wenn ein Programm angehalten ist, wird es wieder in den Vordergrund gerückt.

Und den Befehl ausführen

bg

Wenn ein Programm angehalten ist, kann es im Hintergrund ausgeführt werden (die Programmausgabe wird jedoch weiterhin an TTY gesendet).

Wenn Sie eine aufgehängte Programm töten wollen, müssen Sie es nicht mit zurückbringen fgerste, können Sie einfach den Befehl tun:

kill %1

Wenn Sie mehrere Befehle ausgesetzt haben, wird ausgeführt

jobs

listet sie wie folgt auf:

[1]-  Stopped                 pianobar
[2]+  Stopped                 yes

Unter Verwendung %#, wo #die Auftragsnummer (die in eckigen Klammern aus dem jobsAusgang) mit bg, fgoder killkann verwendet werden , um die Aktion auf diesem Job zu tun.

Wuffers
quelle
3
Mit dem sttyBefehl können Sie ändern, welche Tasten welchen Job ausführen. Zum Beispiel stty susp ^Z oder stty intr ^C.
RedGrittyBrick
7
Tatsächlich sendet es SIGTSTP, das abgefangen werden kann.
Simon Richter
2
Cool! Wenn sich ein Programm weigert, mit Strg + C zu sterben, wie können Sie es dann zwingen, es zu töten?
Aditya MP
2
@adityamenon Suchen Sie den Namen der ausführbaren Datei, amarokund führen Sie sie aus killall amarok, oder führen ps auxSie die Prozess-ID aus , und suchen Sie sie neben dem Namen der ausführbaren Datei, und führen Sie sie aus kill {process id}.
Bruno Finger
22

Strg + Z unterbricht den Vorgang mit SIGTSTP, Sie können ihn später fortsetzen. Strg + C bricht den Prozess mit SIGINT ab, wodurch der Prozess abgebrochen wird, es sei denn, er wird vom Ziel behandelt / ignoriert, sodass Sie ihn nicht fortsetzen können. Es gibt auch einen SIGSTOP, der gesendet werden kann kill()und den der Prozess nicht abfangen kann. SIGCONT ist das Gegenstück zu SIGSTOP und SIGTSTP, das den Prozess aufhebt.

Ben Voigt
quelle
Nein, das ist SIGTSTP, nicht SIGSTOP und es kann abgefangen werden.
sch
@sch, stimmt das jetzt?
Ben Voigt
Ja, wenn Ctrl-Z (und CTRL-C) führen zu einer Prozessgruppe (die Vordergrundprozessgruppe des Terminals) , das Signal zu empfangen, die nicht unbedingt nur einen Prozess. Beachten Sie auch, dass SIGTTIN und SIGTTOU an Prozesse gesendet wurden, die sich nicht in der Vordergrundprozessgruppe des Terminals befinden, wenn Sie versuchen, von diesem zu lesen oder darauf zu schreiben, wodurch diese ebenfalls angehalten werden.
Sch
@sch: Ist der Prozess gegen Gruppe nicht nur ein Unterschied in der Art und Weise, wie das Signal gesendet wird? Mit IIRC kill()können Sie problemlos SIGSTOPan eine Gruppe senden .
Ben Voigt
Ja, mein Befehl betraf, dass Ihre STRG-Z-Taste den Prozess anhält. Dies könnte die Leute irreführen, zu glauben, dass er nur an einen Prozess gesendet wird, wenn es sich tatsächlich um einen Job oder eine Prozessgruppe handelt .
sch
17

STRG + Z stoppt (pausiert) einen Job

STRG + C beendet einen Job

Mit STRG + C können Sie den Vorgang nicht fortsetzen. Mit STRG + Z können Sie den Job jedoch fortsetzen, indem Sie einfach Folgendes an der Eingabeaufforderung eingeben:

fg %1

Wenn Sie mehrere Prozesse angehalten haben, sollten Sie dies tun

jobs

um die Ausgabe zu sehen und die entsprechende Nummer auszuwählen, die fortgesetzt werden soll, z

fg %3

setzt den dritten Job in der Liste fort. Sie können Jobs auch im Hintergrund mit ausführen lassen

bg %n

Wobei n die Auftragsnummer ist.

g24l
quelle
Das sind Jobs (Prozessgruppen), keine Prozesse, mit denen sich CTRL-C, CTRL-Z, fg und bg befassen.
sch
3
Cntrl + Z pause the currently running process. 

Und

Cntrl + C simply terminates the running process.

Mit Cntrl + C können Sie den Vorgang nicht fortsetzen. Mit Cntrl + Z können Sie den Vorgang fortsetzen.

Verwenden Sie fg% 1, um den Vorgang fortzusetzen.

Ravindra Miyani
quelle
3

CTRL+ Zstoppt (pausiert) einen Job

CTRL+ Cbeendet einen Job

Mit CTRL+ können CSie den Vorgang nicht fortsetzen, mit CTRL+ können Sie Zden Job jedoch fortsetzen, indem Sie einfach Folgendes an der Eingabeaufforderung eingeben:

fg% 1

Wenn Sie mehrere Prozesse angehalten haben, sollten Sie dies tun

Arbeitsplätze

um die Ausgabe zu sehen.

abul
quelle
2

Die vorherigen Antworten sind korrekt, aber aus einem unbekannten Grund unterbricht Strg-Z auch alle untergeordneten Prozesse, aber killall -SIGSTOP ... unterbricht nur den vordersten (übergeordneten) Prozess und lässt die untergeordneten Prozesse so laufen, wie sie möchten.

Kostas
quelle