%20n%C3%A3o%20funciona%20para%20script%20iniciado%20por%20comando%20de%20script.png)
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?
Responder1
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 capturar SIGSTOP
.
Nestes exemplos que usei $
para indicar o prompt da linha de comando:
$ script
Script started, output log file is 'typescript'.
$ sleep 5 # After starting this I hit Ctrl/Z
[1]+ Stopped sleep 5
$
Se você enviar script
o SIGTSTP
sinal para si mesmo, ele parecerá confuso (falha de programação, talvez?) E SIGCONT
não o retomará. No entanto, o envio SIGINT
ou algum outro sinal de terminação é retomado script
por tempo suficiente para acionar o original SIGTSTP
e suspender. Em seguida, tentar retomar o script
comando fg
encerra a sessão:
$ 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
Neste momento script
recebeu SIGTSTP
e deixou de executar o seu processo interno. Posteriormente, o envio SIGCONT
não fez diferença visível.
O envio SIGINT
resultou nisso:
Mon, 15 Apr 2
[1]+ Stopped script
E então retomando o comando:
$ fg
script
Session terminated, killing shell... ...killed.
Script done.
Parece-me que seria melhor enviar SIGSTOP
para o processo interno script
. Aqui está outro exemplo:
$ 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.