Edoardoo
Edoardoo

Reputation: 2909

Save Screen (program) output to a file

I need to save the whole output of Screen to a file to check later all the content.

The reason is that I'm dumping a flash memory through a serial port, using Screen to interface with it. I would like to save it to a file to check memory structure.

I've tried:

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

And I've also tried to use bufferfile from screen, but I don't understand how to use it.

Is there an easy way?

Upvotes: 201

Views: 331744

Answers (12)

Ratan Raj
Ratan Raj

Reputation: 499

The existing screen log can be saved by:

Ctrl+A :

hardcopy -h filename

Upvotes: 35

Alberto Soto
Alberto Soto

Reputation: 164

It cost me a lot to find a clean solution. Although previous replies are fine, I found out this to be more direct.

This command will wait 5 seconds to write the output to a file. The 'sudo' part depends of your environment.

screen -dm bash -c 'sleep 5;echo "done" | sudo tee ./test.txt'

Upvotes: 1

NeliJ
NeliJ

Reputation: 1461

You can also use Ctrl + A, H to save loggings into a screenlog.n file.

And one more Ctrl + A, H to turn it off.

Ctrl + A, H: Begins/ends logging of the current window to the file "screenlog.n".

Upvotes: 144

Nikhil
Nikhil

Reputation: 1172

The following command works for Screen version 4.06.02:

screen -L -Logfile Log_file_name_of_your_choice command_to_be_executed

From the man page of Screen:

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

You can check the existing version of Screen using screen -version. You can download and install the latest Screen version from https://www.gnu.org/software/screen/.

Upvotes: 70

lepe
lepe

Reputation: 25210

The selected answer doesn't work quite well with multiple sessions and doesn't allow to specify a custom log file name.

For multiple screen sessions, this is my formula:

  1. Create a configuration file for each process:

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

    If you want to do it "on the fly", you can change logfile automatically. \012 means "new line", as using \n will print it on the log file: source.

  2. Start your command with the "-c" and "-L" flags:

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

    That's it. You will see "test.log" after the first 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 ]
    ...
    

I found that "-L" is still required even when "log on" is on the configuration file.

I couldn't find a list of the time format variables (like %m) used by screen. If you have a link of those formats, please post it bellow.

Extra

In case you want to do it "on the fly", you can use this 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

To use it, save it (screen.sh) and set +x permissions:

./screen.sh TEST ./test.pl

... and will execute ./test.pl and create a log file in /var/log/TEST.log

Upvotes: 29

ryan
ryan

Reputation: 899

For the Mac terminal:

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

Details

  • script: A built-in application to "make a typescript of terminal session"
  • -a: Append to output file
  • -t 0: Time between writing to output file is 0 seconds, so out.txt is updated for every new character
  • out.txt: Is just the output file name
  • screen /dev/ttyUSB0 115200: Command from question for connecting to an external device

You can then use tail to see that the file is updating.

tail -100 out.txt

Upvotes: 19

Keo Malope
Keo Malope

Reputation: 1015

The following might be useful (tested on: Linux/Ubuntu 12.04 (Precise Pangolin)):

cat /dev/ttyUSB0

Using the above, you can then do all the re-directions that you need. For example, to dump output to your console while saving to your file, you'd do:

cat /dev/ttyUSB0 | tee console.log

Upvotes: 6

rkelleycook
rkelleycook

Reputation: 151

A different answer if you need to save the output of your whole scrollback buffer from an already actively running screen:

Ctrl-a [ g SPACE G $ >.

This will save your whole buffer to /tmp/screen-exchange

Upvotes: 15

rkok
rkok

Reputation: 1064

Here's a trick: wrap it in sh -c!

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

Where 2>&1 redirects stderr to stdout so tee can catch and log error messages.

Upvotes: 8

jaggedsoft
jaggedsoft

Reputation: 4038

Ctrl+A then Shift+H works for me. You can view the file screenlog.0 while the program is still running.

Upvotes: 14

Fergie
Fergie

Reputation: 2003

There is a command line option for logging. The output is saved to screenlog.n file, where n is a number of the screen. From man pages of screen:

‘-L’ Tell screen to turn on automatic output logging for the windows.

Upvotes: 196

Ruben
Ruben

Reputation: 1437

The 'script' command under Unix should do the trick. Just run it at the start of your new console and you should be good.

Upvotes: 7

Related Questions