Salvar saída da tela (programa) em um arquivo

130

Preciso salvar toda a saída do Screen em um arquivo para verificar mais tarde todo o conteúdo.

O motivo é que estou descarregando uma memória flash através de uma porta serial, usando o Screen para fazer interface com ela. Gostaria de salvá-lo em um arquivo para verificar a estrutura da memória.

Eu tentei:

$: screen /dev/ttyUSB0 115200 >> foo.txt
$: screen /dev/ttyUSB0 115200 | tee foo.txt

E também tentei usar o arquivo de buffer da tela, mas não entendo como usá-lo.

Existe uma maneira fácil?

Edoardoo
fonte
A configuração de produção que estou usando tem várias instâncias de tela. Aquele cuja saída eu preciso tem linha como 'pts / 10'. Portanto, o que devo fazer para obter sua saída para um arquivo?
Sid

Respostas:

129

Há uma opção de linha de comando para o log. A saída é salva no arquivo screenlog.n, em que n é um número da tela. Nas páginas do manual da tela:

'-L' Diga à tela para ativar o log de saída automático para as janelas.

Fergie
fonte
6
Obrigado. Existe uma maneira de produzir o que a tela já possui em seu buffer de saída? Por exemplo, eu esqueci de ativar o log, mas a saída está disponível no buffer da tela de rolagem - como gravar isso em um arquivo?
Tagar
48
Apenas pesquisei um pouco mais. Aqui está a resposta para meu comentário repulsivo - stackoverflow.com/questions/4807474/… Ctrl + A e: para entrar no modo de comando, copie-h <filename> caso alguém mais precise disso.
Tagar
3
O arquivo de log será criado no mesmo diretório em que você executou a tela.
Lepe
1
Ontem eu fiz uma "tela -L", desconectei minha sessão SSH, efetuei login novamente hoje e reconectei usando "tela -r" (eu tinha apenas uma), saí e fiz uma find / -name "screen*log"que não encontrou nada.
pacoverflow
104

Você também pode usar Control-a + H para salvar registros no arquivo screenlog.n. Mais um Control-a + H para desligar.

Ca H: Inicia / encerra o log da janela atual no arquivo "screenlog.n".

NeliJ
fonte
5
+1. Se o log não puder ser criado, tente alterar o diretório de trabalho da janela da tela: Ctrl- a+ :e digite por exemplochdir /home/foobar/baz
Chriki
2
Ca + H apenas muda as janelas da tela para mim. Nada a ver com um arquivo de log!
aaa90210
2
@ aaa90210 É ctrl-a seguido de uma pressão separada de h para uma cópia impressa. ctrl-a seguido de uma pressão separada de shift-h inicia um arquivo de log completo.
James
1
Procurando o arquivo screenlog.0 criado por Ctrl-a H? unix.stackexchange.com/questions/198881/…
straville
20

A resposta selecionada não funciona muito bem com várias sessões e não permite especificar um nome de arquivo de log personalizado.

Para várias sessões de tela, esta é minha fórmula:

  1. Crie um arquivo de configuração para cada processo:

    logfile test.log
    logfile flush 1
    log on
    logtstamp after 1
    logtstamp string "[ %t: %Y-%m-%d %c:%s ]\012"
    logtstamp on
    

    Se você quiser fazê-lo "on the fly", você pode alterar logfileautomaticamente. \012significa "nova linha", pois o uso \nserá impresso no arquivo de log: origem .

  2. Inicie seu comando com os sinalizadores "-c" e "-L":

    screen -c ./test.conf -dmSL 'Test' ./test.pl
    

    É isso aí. Você verá "test.log" após o primeiro flush:

    ...
    6 Something is happening...
    [ test.pl: 2016-06-01 13:02:53 ]
    7 Something else...
    [ test.pl: 2016-06-01 13:02:54 ]
    8 Nothing here
    [ test.pl: 2016-06-01 13:02:55 ]
    9 Something is happening...
    [ test.pl: 2016-06-01 13:02:56 ]
    10 Something else...
    [ test.pl: 2016-06-01 13:02:57 ]
    11 Nothing here
    [ test.pl: 2016-06-01 13:02:58 ]
    ...
    

Eu descobri que "-L" ainda é necessário, mesmo quando "logon" está no arquivo de configuração.

Não consegui encontrar uma lista das variáveis ​​de formato de hora (como% m) usadas pela tela. Se você possui um link desses formatos, poste abaixo.

Extra

Caso você queira fazê-lo "on the fly", você pode usar este script:

#!/bin/bash
if [[ $2 == "" ]]; then
    echo "Usage: $0 name command";
    exit 1;
fi
name=$1
command=$2
path="/var/log";
config="logfile ${path}/${name}.log
logfile flush 1
log on
logtstamp after 1
logtstamp string \"[ %t: %Y-%m-%d %c:%s ]\012\"
logtstamp on";
echo "$config" > /tmp/log.conf
screen -c /tmp/log.conf -dmSL "$name" $command
rm /tmp/log.conf

Para usá-lo, salve-o (screen.sh) e defina + x permissões:

./screen.sh TEST ./test.pl

... e executará ./test.pl e criará um arquivo de log em /var/log/TEST.log

lepe
fonte
1
Obrigado - a on-the-flyparte é super útil.
Ram RS
1
Na sequência, uma noite ecrã correr com um arquivo de configuração criados e excluídos na mosca com erros para fora em um screen -rcom "Unable to open "/tmp/log.conf". Além disso, a tela passou de [detached]estado para inexistente. Qual poderia ter sido o problema?
Ram RS
1
O que seu comando faz? tela irá recriar o arquivo de log quando estiver ausente, então estou supondo / tmp / ficar sem espaço ou tive algum outro problema relacionado ao sistema operacional? Eu uso essa abordagem em vários servidores que são executados indefinidamente e até agora não vejo essa situação há pelo menos 1 ano. Se você quiser, podemos iniciar um bate-papo e eu posso ajudá-lo a depurar seu problema.
Lepe #
1
Eu acho que você está certo, não deve encerrar a tela se você estiver executando o processo que caminho, que é o mesmo que executar: screen bash. Se qualquer outro processo estiver matando sua tela, ela deverá ser listada como 'morta', mas não desaparecerá. Não tenho certeza do que pode ser.
quer
1
@ qräbnö: Boa captura! Todo esse tempo e eu não percebi. Eu atualizei a resposta de acordo.
Lepe
20

O comando a seguir funciona para a versão de tela 4.06.02:

screen -L -Logfile Log_file_name_of_your_choice command_to_be_executed

Na página de manual da Tela :

-Logfile file : By default logfile name is "screenlog.0".
                You can set new logfile name with the "-Logfile" option.

Você pode verificar a versão existente do Screen usando a versão screen . Você pode baixar e instalar a versão mais recente da tela em https://www.gnu.org/software/screen/ .

Nikhil
fonte
Além disso, você pode deixar o command_to_be_executed como em branco e digite uma série de empregos de longa execução
devssh
Lembre-se de ter permissões de gravação no diretório de trabalho da tela, pois, caso contrário, ela falhará silenciosamente (simplesmente não será registrada sem nenhum aviso)
okrutny
15

Para o terminal Mac:

script -a -t 0 out.txt screen /dev/ttyUSB0 115200

Detalhes

  • script: Um aplicativo interno para "criar um texto datilografado da sessão do terminal"
  • -a: Anexar ao arquivo de saída
  • -t 0: O tempo entre a gravação no arquivo de saída é de 0 segundos; portanto, out.txt é atualizado para cada novo caractere
  • out.txt: É apenas o nome do arquivo de saída
  • screen /dev/ttyUSB0 115200: Comando da pergunta para conectar a um dispositivo externo

Você pode usar o tail para verificar se o arquivo está sendo atualizado.

tail -100 out.txt
ryan
fonte
1
Isso não funcionou para mim em um Mac. O arquivo de log mostra o script iniciando o comum e o comando final, mas não os dados recebidos do comando screen.
David
10

Ctrl+Aentão Shift+Hfunciona para mim. Você pode visualizar o arquivo screenlog.0enquanto o programa ainda está em execução.

jaggedsoft
fonte
1
Ctrl + A e H.
Shimon Doodkin 17/03/19
1
@ShimonDoodkin Eu tentei isso, por algum motivo não funciona no Debian. Pode ser útil para os outros. Obrigado!
Jaggedsoft
5

O comando 'script' no Unix deve fazer o truque. Basta executá-lo no início do seu novo console e você deve ser bom.

Ruben
fonte
ótimo! onde ele imprime?
Edoardoo
Ele deve apenas gravar em um arquivo. Command é um pouco confuso, mas eu acho que isso pode resolver isso um pouco: linux.byexamples.com/archives/279/...
Ruben
5

Aqui está um truque: envolva-o sh -c!

screen sh -c './some-script 2>&1 | tee mylog.log'

Onde 2>&1redireciona o stderr para o stdout, teepode capturar e registrar mensagens de erro.

rkok
fonte
5

O seguinte pode ser útil (testado em: Linux / Ubuntu 12.04 (Precise Pangolin)):

cat /dev/ttyUSB0

Usando o descrito acima, você pode fazer todas as orientações necessárias. Por exemplo, para despejar a saída no seu console enquanto salva no seu arquivo, você deve:

cat /dev/ttyUSB0 | tee console.log
Keo Malope
fonte
Este funcionou para mim perfeitamente. Estou registrando a saída do monitor serial de uma sessão de captura de dados do Arduino.
Ian Pitts
3

Uma resposta diferente se você precisar salvar a saída de todo o buffer de rolagem a partir de uma tela já em execução:

Ctrl-a [ g SPACE G $ >.

Isso salvará seu buffer inteiro em / tmp / screen-exchange

rkelleycook
fonte
2

O registro de tela existente pode ser salvo por:

Ctrl+A : cópia impressa -h nome do arquivo

Ratan Raj
fonte