SIGTSTP (Strg-Z) funktioniert nicht für Skript, das durch Skriptbefehl gestartet wurde

SIGTSTP (Strg-Z) funktioniert nicht für Skript, das durch Skriptbefehl gestartet wurde

Hinweis: scriptbezieht sich auf den scriptBefehl, der stdin und stdout in Dateien protokolliert.

Ich habe versucht, mit dem Dienstprogramm ein Skript auszuführen,  scriptum die Ausgabe zur späteren Überprüfung zu speichern und gleichzeitig die Textfarben auf dem Terminal beizubehalten.

  • CtrlWenn ich versuche, das aktuelle Skript mit + Z( ) anzuhalten SIGTSTP, wird die Konsole gedruckt ^Z, aber das Skript lässt sich einfach nicht stoppen.
  • Ich habe dann versucht Ctrl+S ( SIGSTOP). Das aktuell ausgeführte Skript friert ein ( htopzeigt alle Prozesse als ZModus an), gibt das Terminal jedoch nicht frei.  Ctrl+ Qsetzt sie fort.

Ich bin jetzt verwirrt, warumSIGSTOP Ctrl+ Sfunktioniert, aber SIGTSTP( Ctrl+ Z) nicht.

Ich weiß SIGTSTP, dass es abgefangen werden kann, aber ich sehe keinen Grund dafür, und in scriptder Manualpage von steht nichts darüber. Ich habe versucht, den Skriptinterpreter in den interaktiven Modus zu zwingen, aber das Ergebnis verwirrt mich noch mehr. Die Eingabe von Ctrl+ Z( SIGTSTP) unterbricht das laufende Skript zwar, scriptsagt aber, dass die Skripte beendet und dann beendet werden, wodurch alle unterbrochenen Kindprozesse beendet werden.

Gibt es eine Möglichkeit, in einer solchen Situation den Suspend-Modus normal zu aktivieren? Kann außerdem jemand genau erklären, was passiert ist?

Antwort1

Wie jedes andere Pass-Through-Tool ( ssh, screen, tmux, usw.) scriptversetzt es das aufrufende Terminal in den Raw-Modus, sodass Zeichen wie Strg/Z keine Interrupts mehr erzeugen. Es leitet diese Zeichen dann weiter und das interne Terminalgerät verarbeitet sie „wie gewohnt“ und erzeugt das erwartete Signal. Jeder Prozess kann sich für Trapping entscheiden, SIGTSTPaber nicht für Catch SIGSTOP.

In diesen Beispielen habe ich $zur Angabe der Eingabeaufforderung Folgendes verwendet:

$ script
Script started, output log file is 'typescript'.
$ sleep 5    # After starting this I hit Ctrl/Z

[1]+  Stopped                 sleep 5
$

Wenn Sie scriptsich selbst das SIGTSTPSignal senden, scheint es verwirrt zu sein (vielleicht ein Programmierfehler?) und SIGCONTwird es nicht fortsetzen. Das Senden SIGINToder ein anderes Beendigungssignal wird jedoch scriptlange genug fortgesetzt, um das Original auszuführen und anzuhalten. Der Versuch, den Befehl SIGTSTPdann fortzusetzen, beendet die Sitzung:scriptfg

$ script
Script started, output log file is 'typescript'.
$ while date; do sleep 5; done
Mon, 15 Apr 2024 14:44:42
Mon, 15 Apr 2024 14:44:47

An diesem Punkt wurde der interne Prozess scriptempfangen SIGTSTPund beendet. Das anschließende Senden SIGCONTmachte keinen sichtbaren Unterschied.

Das Senden SIGINTergab folgendes:

Mon, 15 Apr 2
[1]+  Stopped                 script

Und dann den Befehl fortsetzen:

$ fg
script

Session terminated, killing shell... ...killed.
Script done.

Meiner Meinung nach wäre es besser, wenn Sie SIGSTOPden Prozess im Inneren senden würden script. Hier ist ein weiteres Beispiel:

$ script
Script started, output log file is 'typescript'.
$ while date; do sleep 5; done
Mon, 15 Apr 2024 14:48:31
Mon, 15 Apr 2024 14:48:36
Mon, 15 Apr 2024 14:48:41
Mon, 15 Apr 2024 14:48:46    # Here I sent SIGSTOP to the shell running the "while" loop
Mon, 15 Apr 2024 14:49:07
Mon, 15 Apr 2024 14:49:12    # Here I hit Ctrl/C to break the loop

$ exit
Script done.

verwandte Informationen