SIGTSTP (Ctrl-Z) no funciona para el script iniciado por el comando del script

SIGTSTP (Ctrl-Z) no funciona para el script iniciado por el comando del script

Nota: scriptse refiere al scriptcomando, que registra stdin y stdout en archivos.

Estaba intentando ejecutar un script con la  scriptutilidad 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 ^Zy el script simplemente no se detiene.
  • Entonces lo intenté Ctrl+S ( SIGSTOP). El script que se ejecuta actualmente se congela ( htopmuestra todos los procesos como Zmodo), aunque no libera el terminal.  Ctrl+ Qlos reanuda.

Ahora estoy confundido por quéSIGSTOP Ctrl+ Sfunciona pero SIGTSTP( Ctrl+ Z) no.

SIGTSTPque puede quedar atrapado, pero no veo ninguna razón para hacerlo y no hay nada al respecto en scriptla 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 scriptdice 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 .screentmuxscriptSIGTSTPSIGSTOP

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 scriptla SIGTSTPseñal a sí mismo, parece confundirse (¿falla de programación, tal vez?) y SIGCONTno la reanudará. Sin embargo, el envío SIGINTo alguna otra señal de terminación se reanuda scriptdurante el tiempo suficiente para activar la original SIGTSTPy suspenderla. Luego, intentar reanudar el scriptcomando fgfinaliza 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 scriptrecibió SIGTSTPy dejó de ejecutar su proceso interno. El envío posterior SIGCONTno hizo ninguna diferencia visible.

El envío SIGINTresultó 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 SIGSTOPal 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.

información relacionada