Nota: script
refere-se ao script
comando, que registra stdin e stdout em arquivos.
Eu estava tentando executar um script com o script
utilitário para salvar a saída para inspeção posterior, preservando as cores do texto no terminal.
- Quando tento suspender o script atual com Ctrl+ Z(
SIGTSTP
), o console é impresso^Z
e o script simplesmente não para. - Eu então tentei Ctrl+S
(. O script atualmente em execução congela (SIGSTOP
)htop
mostra todos os processos comoZ
modo), embora não libere o terminal. Ctrl+ Qos retoma.
Agora estou confuso por que
Ctrl+ Sfunciona, mas SIGSTOP
SIGTSTP
( Ctrl+ Z) não.
Eu sei SIGTSTP
que posso estar preso, mas não vejo razão para fazer isso e não há nada sobre isso na script
página de manual do. Tentei forçar o interpretador de script para o modo interativo, mas o resultado me deixou mais confuso. A emissão de Ctrl+ Z( SIGTSTP
) suspende o script em execução, mas script
indica que os scripts foram concluídos e encerrados, o que elimina todos os processos filhos suspensos.
Existe uma maneira de permitir a suspensão normalmente em tal situação? Além disso, alguém pode explicar exatamente o que aconteceu?
Assim como qualquer outra ferramenta de passagem (
ssh
,screen
,tmux
, etc.),script
coloca o terminal de chamada em modo bruto para que caracteres como Ctrl/Z não gerem mais interrupções. Em seguida, ele passa esses caracteres e o dispositivo terminal interno os processa "normalmente", gerando o sinal esperado. Qualquer processo pode optar por capturar,SIGTSTP
mas não pode capturarSIGSTOP
.Nestes exemplos que usei
$
para indicar o prompt da linha de comando:Se você enviar
script
oSIGTSTP
sinal para si mesmo, ele parecerá confuso (falha de programação, talvez?) ESIGCONT
não o retomará. No entanto, o envioSIGINT
ou algum outro sinal de terminação é retomadoscript
por tempo suficiente para acionar o originalSIGTSTP
e suspender. Em seguida, tentar retomar oscript
comandofg
encerra a sessão:Neste momento
script
recebeuSIGTSTP
e deixou de executar o seu processo interno. Posteriormente, o envioSIGCONT
não fez diferença visível.O envio
SIGINT
resultou nisso:E então retomando o comando:
Parece-me que seria melhor enviar
SIGSTOP
para o processo internoscript
. Aqui está outro exemplo: