Salva l'output dello schermo (programma) su un file


130

Devo salvare l'intero output di Screen in un file per controllare in seguito tutto il contenuto.

Il motivo è che sto scaricando una memoria flash attraverso una porta seriale, usando Screen per interfacciarmi. Vorrei salvarlo su un file per verificare la struttura della memoria.

Ho provato:

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

E ho anche provato a usare bufferfile dallo schermo, ma non capisco come usarlo.

C'è un modo semplice?


L'impostazione di produzione che sto usando ha più istanze di schermo. Quello di cui ho bisogno di output ha una linea come 'pts / 10'. Quindi cosa devo fare per ottenere l'output in un file?
Sid

Risposte:


129

Esiste un'opzione della riga di comando per la registrazione. L'output viene salvato nel file screenlog.n, dove n è un numero di schermo. Dalle pagine man dello schermo:

'-L' Indica alla schermata di attivare la registrazione automatica dell'output per le finestre.


6
Grazie. Esiste un modo per generare l'output dello schermo già presente nel suo buffer di output? Ad esempio, ho dimenticato di abilitare la registrazione, ma l'output è disponibile nel buffer dello schermo di scorrimento: come scriverlo su un file?
Tagar,

48
Ho appena cercato su Google un po 'di più ... Ecco la risposta per il mio commento dispettoso : stackoverflow.com/questions/4807474/… Ctrl + A e: per arrivare alla modalità di comando, quindi copia -h <nomefile> nel caso qualcuno ne abbia bisogno.
Tagar,

3
Il file di registro verrà creato nella stessa directory in cui è stata eseguita la schermata.
lepe,

1
Ieri ho fatto uno "schermo -L", disconnesso la mia sessione SSH, ricollegato oggi e ricollegato usando "screen -r" (ne avevo solo uno), sono uscito e ho fatto uno find / -name "screen*log"che non ha trovato nulla.
pacoverflow,


104

Puoi anche usare Control-a + H per salvare le registrazioni nel file screenlog.n. Un altro Control-a + H per spegnere.

Ca H: inizia / termina la registrazione della finestra corrente nel file "screenlog.n".


5
+1. Se non è possibile creare il registro, provare a modificare la directory di lavoro della finestra dello schermo: Ctrl- a+ :e digitare ad esempiochdir /home/foobar/baz
Chriki,

2
Ca + H cambia solo le finestre dello schermo per me. Niente a che fare con un file di registro!
aaa90210

2
@ aaa90210 È ctrl-a seguito da una pressione separata di h per una copia cartacea. ctrl-a seguito da una pressione separata di shift-h avvia un file di registro completo.
James,

1
Cerchi il file screenlog.0 creato da Ctrl-a H? unix.stackexchange.com/questions/198881/…
straville

20

La risposta selezionata non funziona abbastanza bene con più sessioni e non consente di specificare un nome file di registro personalizzato.

Per più sessioni dello schermo, questa è la mia formula:

  1. Crea un file di configurazione per ogni processo:

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

    Se vuoi farlo "al volo", puoi cambiare logfileautomaticamente. \012significa "nuova riga", poiché l'utilizzo \nlo stamperà sul file di registro: sorgente .

  2. Inizia il tuo comando con i flag "-c" e "-L":

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

    Questo è tutto. Vedrai "test.log" dopo il primo 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 ]
    ...
    

Ho scoperto che "-L" è ancora richiesto anche quando "accedi" si trova nel file di configurazione.

Non sono riuscito a trovare un elenco delle variabili del formato dell'ora (come% m) utilizzate dallo schermo. Se hai un link di questi formati, ti preghiamo di pubblicarlo qui sotto.

Extra

Nel caso in cui tu voglia farlo "al volo", puoi usare questo 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

Per usarlo, salvalo (screen.sh) e imposta le autorizzazioni + x:

./screen.sh TEST ./test.pl

... ed eseguirà ./test.pl e creerà un file di registro in /var/log/TEST.log


1
Grazie - la on-the-flyparte è super utile.
Ram RS,

1
Successivamente, una schermata viene eseguita durante la notte con un file di configurazione creato ed eliminato al volo errato su un screen -rcon "Unable to open "/tmp/log.conf". Inoltre, lo schermo è passato da [detached]stato a inesistente. Quale potrebbe essere stato il problema?
Ram RS,

1
Cosa fa il tuo comando? schermo ricrea il file di registro quando manca, quindi sto indovinando / tmp / esaurito lo spazio o hai avuto qualche altro problema relativo al sistema operativo? Uso questo approccio in diversi server che funzionano a tempo indeterminato e finora non vedo tale situazione da almeno 1 anno. Se vuoi, possiamo avviare una chat e posso aiutarti a eseguire il debug del tuo problema.
lepe,

1
Penso che tu abbia ragione, non è dovrebbe terminare lo schermo se si esegue il processo in questo modo, che è lo stesso di esecuzione: screen bash. Se qualsiasi altro processo sta uccidendo il tuo schermo, dovrebbe essere elencato come "morto", ma non scomparire. Non sono sicuro di cosa possa essere.
lepe,

1
@ qräbnö: bella cattura! Per tutto questo tempo e non me ne sono accorto. Ho aggiornato la risposta di conseguenza.
lepe

20

Il seguente comando funziona per la versione dello schermo 4.06.02:

screen -L -Logfile Log_file_name_of_your_choice command_to_be_executed

Dalla pagina man di Screen :

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

Puoi controllare la versione esistente di Screen usando screen -version . Puoi scaricare e installare l'ultima versione dello schermo da https://www.gnu.org/software/screen/ .


Inoltre puoi lasciare il comando_to_essere_eseguito come vuoto e inserire una serie di lavori di lunga durata
devssh

Ricorda di avere i permessi di scrittura per la directory di lavoro dello schermo, perché altrimenti fallisce silenziosamente (semplicemente non registra senza alcun avviso)
okrutny

15

Per il terminale Mac:

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

Dettagli

  • script: Un'applicazione integrata per "creare un dattiloscritto della sessione terminale"
  • -a: Aggiungi al file di output
  • -t 0: Il tempo tra la scrittura nel file di output è di 0 secondi, quindi out.txt viene aggiornato per ogni nuovo carattere
  • out.txt: È solo il nome del file di output
  • screen /dev/ttyUSB0 115200: Comando dalla domanda per la connessione a un dispositivo esterno

È quindi possibile utilizzare tail per vedere che il file si sta aggiornando.

tail -100 out.txt

1
Questo non ha funzionato per me su un Mac. Il file di registro mostra lo script che avvia il comando comune e termina il comando, ma non i dati ricevuti dal comando schermo.
David,

10

Ctrl+Aquindi Shift+Hlavora per me. È possibile visualizzare il file screenlog.0mentre il programma è ancora in esecuzione.


1
Ctrl + A poi H.
Shimon Doodkin,

1
@ShimonDoodkin L'ho provato, per qualche motivo non funziona su Debian. Potrebbe essere utile agli altri però. Grazie!
jaggedsoft,

5

Il comando 'script' sotto Unix dovrebbe fare il trucco. Basta eseguirlo all'inizio della nuova console e dovresti essere bravo.


grande! dove lo stampa?
Edoardoo,

Dovrebbe solo scrivere su un file. Il comando è un po 'disordinato ma penso che questo potrebbe risolverlo un po': linux.byexamples.com/archives/279/…
Ruben

5

Ecco un trucco: avvolgilo sh -c!

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

Dove 2>&1reindirizza stderr a stdout in modo da teepoter catturare e registrare i messaggi di errore.


5

Potrebbe essere utile (testato su: Linux / Ubuntu 12.04 (Precise Pangolin)):

cat /dev/ttyUSB0

Usando quanto sopra, puoi quindi fare tutte le direzioni necessarie. Ad esempio, per scaricare l'output sulla console durante il salvataggio nel file, è necessario:

cat /dev/ttyUSB0 | tee console.log

Questo ha funzionato perfettamente per me. Sto registrando l'output del monitor seriale da una sessione di acquisizione dati Arduino.
Ian Pitts,

3

Una risposta diversa se è necessario salvare l'output dell'intero buffer di scorrimento da una schermata già attiva:

Ctrl-a [ g SPACE G $ >.

Ciò salverà l'intero buffer in / tmp / scambio schermo


2

Il registro dello schermo esistente può essere salvato da:

Ctrl+A : hardcopy -h nomefile

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.