%20no%20funciona%20para%20el%20script%20iniciado%20por%20el%20comando%20del%20script.png)
Nota: script
se refiere al script
comando, que registra stdin y stdout en archivos.
Estaba intentando ejecutar un script con la script
utilidad para guardar el resultado para una inspección posterior y al mismo tiempo conservar los colores del texto en la terminal.
- Cuando intento suspender el script actual con Ctrl+ Z(
SIGTSTP
), la consola se imprime^Z
y el script simplemente no se detiene. - Entonces lo intenté Ctrl+S
(. El script que se ejecuta actualmente se congela (SIGSTOP
)htop
muestra todos los procesos comoZ
modo), aunque no libera el terminal. Ctrl+ Qlos reanuda.
Ahora estoy confundido por qué
Ctrl+ Sfunciona pero SIGSTOP
SIGTSTP
( Ctrl+ Z) no.
Sé SIGTSTP
que puede quedar atrapado, pero no veo ninguna razón para hacerlo y no hay nada al respecto en script
la página del manual. Intenté forzar el intérprete de scripts al modo interactivo, pero el resultado me confunde aún más. Emitir Ctrl+ Z( SIGTSTP
) suspende el script en ejecución, pero script
dice que los scripts finalizan y luego salen, lo que elimina todos los procesos secundarios suspendidos.
¿Hay alguna manera de permitir la suspensión normalmente en tal situación? Además, ¿alguien puede explicar exactamente qué pasó?
Respuesta1
Al igual que cualquier otra herramienta de transferencia ( ssh
,,, etc.), coloca el terminal que llama en modo sin formato para que caracteres como Ctrl/Z ya no generen interrupciones. Luego pasa estos caracteres y el dispositivo terminal interno los procesa "normalmente", generando la señal esperada. Cualquier proceso puede optar por atrapar pero no puede capturar .screen
tmux
script
SIGTSTP
SIGSTOP
En estos ejemplos he utilizado $
para indicar la línea de comando:
$ script
Script started, output log file is 'typescript'.
$ sleep 5 # After starting this I hit Ctrl/Z
[1]+ Stopped sleep 5
$
Si se envía script
la SIGTSTP
señal a sí mismo, parece confundirse (¿falla de programación, tal vez?) y SIGCONT
no la reanudará. Sin embargo, el envío SIGINT
o alguna otra señal de terminación se reanuda script
durante el tiempo suficiente para activar la original SIGTSTP
y suspenderla. Luego, intentar reanudar el script
comando fg
finaliza la sesión:
$ 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
En este punto script
recibió SIGTSTP
y dejó de ejecutar su proceso interno. El envío posterior SIGCONT
no hizo ninguna diferencia visible.
El envío SIGINT
resultó en esto:
Mon, 15 Apr 2
[1]+ Stopped script
Y luego reanudando el comando:
$ fg
script
Session terminated, killing shell... ...killed.
Script done.
Me parece que sería mejor enviar SIGSTOP
al proceso interno script
. Aquí hay otro ejemplo:
$ 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.