Strg c vs. Strg z mit Vordergrundjob

26

Ctrl+ Zstoppt den Job, während Ctrl+ Cden Job beendet.

Warum das? Wäre der andere Weg nicht sinnvoller?

z@z-lap:~$ sleep 100&
[1] 4458
z@z-lap:~$ sleep 200&
[2] 4459
z@z-lap:~$ jobs
[1]-  Running                 sleep 100 &
[2]+  Running                 sleep 200 &
z@z-lap:~$ fg %1
sleep 100
^Z
[1]+  Stopped                 sleep 100
z@z-lap:~$ jobs
[1]+  Stopped                 sleep 100
[2]-  Running                 sleep 200 &
z@z-lap:~$ fg %1
sleep 100
^C
z@z-lap:~$ jobs
[2]+  Running                 sleep 200 &
neo0
quelle
4
"Wäre der andere Weg nicht sinnvoller?" Können Sie angeben, warum dies Ihrer Meinung nach der Fall ist?
Glglgl

Antworten:

55

Ich glaube, Sie sind möglicherweise verwirrt über die Jobkontrollnotation. Insbesondere bedeutet "Gestoppt", dass ein Job noch aktiv ist, aber dass seine Fähigkeit, etwas zu verarbeiten, angehalten wurde (die CPU hat keine Zeit, etwas zu verarbeiten). Dies ist praktisch ein "Pause" - oder "Suspended" -Zustand, obwohl dies nicht der richtige Fachbegriff ist.

  • CtrlCstoppt einen Job nicht, sondern bricht ihn ab oder beendet ihn. Technisch bedingt dies, dass ein Interrupt-Signal an das Programm gesendet wird, das es auffordert, den Vorgang abzubrechen und sofort zu beenden. Einige Programme hören dieses Signal und führen vor dem Beenden einige Notbereinigungsarbeiten an sich selbst durch. Andere reagieren nicht auf das Signal und werden anschließend einfach abgebrochen.

  • CtrlZHält andererseits einen Job an. Auch dies geschieht mit einem Signal, aber diesmal ist es ein "Stopp" anstelle eines "Interrupt" -Signals. Dadurch wird es effektiv angehalten und die Kontrolle an die Shell zurückgegeben, der Job wird jedoch nicht beendet. Wenn Sie möchten, dass ein solcher Job weiter ausgeführt wird, können Sie einen bgBefehl absetzen, um den zuletzt gestoppten Job an den Hintergrund zu senden. Es wird dann als Hintergrundjob weiter ausgeführt, als ob Sie es mit ausgeführt hätten &. Sie können auch verwenden fg, um den zuletzt angehaltenen Job im Vordergrund fortzusetzen (sodass er dort fortgesetzt wird, wo er aufgehört hat, und Sie erneut mit ihm interagieren können).

Caleb
quelle
Ich denke immer noch, dass Strg + Z SIGKILL und Strg + C SIGINIT sendet. Die Tastenkombination Strg + Z würde also auch den Job beenden. Aber aus meinem Beispiel Strg + Z Stoppt nur den Job, wie Sie gesagt haben. Das macht mich ein bisschen verwirrt.
Neo0
10
@ neo0 - vielleicht bist du an ein seltsames benutzerdefiniertes Setup gewöhnt? Sie können dieses Zeug konfigurieren - obwohl Sie es wahrscheinlich nicht tun sollten, wenn Sie eine Anwendung haben, die sich auf diese Karten stützt. Die Standardkonfiguration ist CTRL+C=SIGINTund CTRL+Z=SIGTSTP.
mikeserv
3
Caleb hat recht (+1). Die Tastenkombination Strg-Z stoppt das Programm, was Sie als "einfrieren" betrachten sollten, aber das Programm befindet sich noch im Speicher, es werden Dateien geöffnet usw. Es wird nicht beendet.
Olivier Dulac
"Anhalten" ist möglicherweise deutlicher als "Anhalten".
Russell Borogove
1
@jiggunjer Das ist ungefähr die Form der Dinge. Diese Antwort gibt einige Hintergrundinformationen darüber, warum zwei Schritte erforderlich sind, und dieser führt einige Funktionen ein, um diese Schritte schmerzloser zu gestalten.
Caleb