Ich schrieb help suspend
und bekam diese kurze Erklärung:
suspend: suspend [-f]
Suspend shell execution.
Suspend the execution of this shell until it receives a SIGCONT signal.
Unless forced, login shells cannot be suspended.
Options:
-f force the suspend, even if the shell is a login shell
Exit Status:
Returns success unless job control is not enabled or an error occurs.
So verstehe ich das: Ich suspend
tippe und das Terminal friert ein, auch strg + c kann es nicht entfrosten. Aber wenn ich ein anderes Terminal öffne und nach der PID für das eingefrorene suche und kill -SIGCONT PID-NR
ein SIGCONT-Signal eingebe, wird es an das eingefrorene Terminal gesendet und aufgetaut, sodass es nicht mehr gefroren ist.
Aber was ist der eigentliche Zweck des Suspendierens eines Terminals? Welche Alltagsanwendungen sind typisch dafür? Was dachten die Leute, die es zu einer eingebauten Shell gemacht haben?
Antworten:
Wenn Sie eine Shell von einer anderen Shell aus starten, können Sie die innere anhalten. Sagen Sie, wenn Sie verwenden
su
und für einen Moment zum normalen Benutzer zurückkehren möchten:(Wenn Sie das tun, vergessen Sie nicht die privilegierte Shell, die im Hintergrund geöffnet ist ...)
In ähnlicher Weise können Sie die Shell auch anhalten, wenn Sie von einem anderen Programm (
!
z. B. dem Befehl inless
) zu einer Shell wechseln. Aber ich würde nicht erwarten, dass viele andere Programme gut damit umgehen, wenn sie einen Unterprozess starten, der sich dann selbst aussetzt.quelle
vim
und habe a ausgeführt:sh
, um eine Unterschale zu erhalten (speziell einezsh
Unterschale). Beim Laufensuspend
bin ich in die Original- Shell geraten (die sowohl die Subshell als auch die Vim aufgehängt hat).zsh
scheint klüger zu sein alsbash
, ich habe versucht, sowohl vorless
als auch vorvi
(Debiansvim.tiny
) zu fliehen : habe auchzsh
die Eltern-App gestoppt,bash
das Ganze aufgehängt.bash
In denbash
Werken though.Dies entspricht dem Drücken Ctrl+Zanderer Befehle.
Es setzt die Shell aus und gibt die Kontrolle an die übergeordnete Shell oder den übergeordneten Prozess zurück, falls vorhanden.
Beispiel:
Das Feature stammt von csh, der BSD-Shell (von der die Job-Kontrolle stammt) in den frühen 80ern .
In AT & T
ksh
ist es ein eingebauter Alias fürkill -s STOP $$
( ja, ohne Anführungszeichen! )In deinem Fall
bash
wurde wahrscheinlich der direkt vom Terminalemulator gestartet. Und Ihr Terminal-Emulator hat nicht damit gerechnet, dass der Prozess unterbrochen wird.Das
bash
war ein Sitzungsleiter. Wenn der Sitzungsleiter suspendiert ist und wir die Ansicht alter Zeitterminals vertreten, hat der Benutzer keine Möglichkeit, diese fortzusetzen.bash
behebt dies, indem es ablehnt,suspend
wenn es sich um eine Anmeldeshell handelt. In Ihrem Fall startet der Terminal-Emulator jedoch möglicherweise nichtbash
im Anmeldemodus, sodass keine Sicherheitsvorkehrungen getroffen werden.zsh
undmksh
haben Sie nicht das Problem, weil sie einSIGTSTP
(das auch gesendete Ctrl+Z) Signal wie csh anstelle vonSIGSTOP
(und an die Prozessgruppe des Aufrufers fürmksh
wie in csh und an die Hauptprozessgruppe der Shell fürzsh
, nicht den$$
Prozess allein, senden ).SIGTSTP
wird ignoriert, wenn sie an eine verwaiste Prozessgruppe übergeben wird, und die Gruppe des Anführers qualifiziert sich. Die Idee ist, dass SIGTSTP nichts aussetzen sollte, was von einem Benutzer nicht wieder aufgenommen werden kann.In
mksh
oderyash
kann auchsuspend
eine Subshell verwendet werden, um sich auszusetzen:Das würde nicht funktionieren,
zsh
wenn SIGTSTP anstelle des Aufrufers an die Hauptprozessgruppe gesendet wird. In jeder Shell, diekill
eingebaut ist, kann man immerkill -s TSTP 0
stattdessen verwenden.quelle
command .... &
aber Sie) vergaß das&
und wünschte nun, Sie könnten es hinzufügen, ohne den Befehl zu unterbrechen): Sie können:ctrl-z
und dannbg
Folgendes eingeben:, um die letzte angehaltene Aufgabe im Hintergrund fortzusetzen. (oderbg %n
um dies mit der Aufgabennummer zu tunn
. Verwenden Sie diese Optionjobs
, um eine Liste der angehaltenen oder ausgeführten Aufgabensuspend
Befehl dient.