Captura de conteúdo terminal a partir de um pseudoterminal (pts)?

0

No Ubuntu, existe uma maneira de capturar o conteúdo de um pseudoterminal (pts - ex. / dev / pts / 4) - ie. despejar as linhas de texto no terminal em um arquivo - de um programa que já está em execução nesse terminal? Não estou falando sobre tirar uma captura de tela, mas armazenar o que o programa está gravando no terminal para um arquivo. É um programa baseado em maldições , que regularmente reescreve a tela.

O meu principal problema é que o meu programa já está em execução - e gostaria de guardar este antes parar (e talvez reiniciar) o programa.

Eu sei que existem várias maneiras de conseguir isso, já pensei sobre essa possibilidade antes Eu comecei o programa: Simplesmente redirecionando a saída para um arquivo; usando screen e fazendo uma cópia impressa ou registrando a sessão; usando um terminal virtual (/ dev / tty ..) e usando o dispositivo de memória do console de vídeo (/ dev / vcs ..); usando o comando script ... (e provavelmente muitos outros ...)

Mas tudo isso só teria funcionado se eu o fizesse antes de começar o programa!

Então, ainda existe uma maneira de eu "bisbilhotar" no pseudoterminal e gravar seu conteúdo? Eu posso me tornar root se eu tiver que ...

    
por Baard Kopperud 21.12.2016 / 04:17

1 resposta

1

Talvez não diretamente do tty, mas este processo tem que usar o write syscall. Você pode usar strace para capturar todas as chamadas de gravação.

sudo strace -e t=write -s 6000 -p your-process-id 2>logfile

Você terá coisas assim, que podem precisar de mais análise:

write(1, "191\n", 4)                    = 4
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=9916, si_uid=1001, si_status=0, si_utime=0, si_stime=0} ---
write(1, "21021\n", 6)                  = 6
write(1, "14728\n", 6)                  = 6
write(1, "13291\n", 6)                  = 6
write(1, "20372\n", 6)                  = 6

Se o seu programa gravar em outros arquivos, você também verá isso na saída. Isso pode ser chato. Ou que eventualmente poderia ser uma enorme quantidade de dados. O descritor de arquivo usado é provavelmente 1. Você pode grep "^ write.1"

sudo strace -e t=write -s 6000 -p your-process-id 2>&1 | grep ^write.1 >logfile

Da próxima vez, tente executar o comando com script . Ele pega todos os dados gravados no tty.

script -c "program and args" logfile
    
por exore 21.12.2016 / 06:31