%20funktioniert%20nicht%20f%C3%BCr%20Skript%2C%20das%20durch%20Skriptbefehl%20gestartet%20wurde.png)
Hinweis: script
bezieht sich auf den script
Befehl, der stdin und stdout in Dateien protokolliert.
Ich habe versucht, mit dem Dienstprogramm ein Skript auszuführen, script
um 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
(. Das aktuell ausgeführte Skript friert ein (SIGSTOP
)htop
zeigt alle Prozesse alsZ
Modus an), gibt das Terminal jedoch nicht frei. Ctrl+ Qsetzt sie fort.
Ich bin jetzt verwirrt, warum
Ctrl+ Sfunktioniert, aber SIGSTOP
SIGTSTP
( Ctrl+ Z) nicht.
Ich weiß SIGTSTP
, dass es abgefangen werden kann, aber ich sehe keinen Grund dafür, und in script
der 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, script
sagt 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.) script
versetzt 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, SIGTSTP
aber 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 script
sich selbst das SIGTSTP
Signal senden, scheint es verwirrt zu sein (vielleicht ein Programmierfehler?) und SIGCONT
wird es nicht fortsetzen. Das Senden SIGINT
oder ein anderes Beendigungssignal wird jedoch script
lange genug fortgesetzt, um das Original auszuführen und anzuhalten. Der Versuch, den Befehl SIGTSTP
dann fortzusetzen, beendet die Sitzung:script
fg
$ 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 script
empfangen SIGTSTP
und beendet. Das anschließende Senden SIGCONT
machte keinen sichtbaren Unterschied.
Das Senden SIGINT
ergab 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 SIGSTOP
den 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.