Save Screen (program) output to a file
LoggingBufferDumpGnu ScreenLogging Problem Overview
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?
Logging Solutions
Solution 1 - Logging
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.
Solution 2 - Logging
You can also use Control-a + H to save loggings into screenlog.n file. One more Control-a + H to turn off.
C-a H: Begins/ends logging of the current window to the file "screenlog.n".
Solution 3 - Logging
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/.
Solution 4 - Logging
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:
-
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. -
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
Solution 5 - Logging
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 characterout.txt
: Is just the output file namescreen /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
Solution 6 - Logging
Ctrl+A then Shift+H works for me. You can view the file screenlog.0
while the program is still running.
Solution 7 - Logging
Existing screen log can be saved by :
Ctrl+A : hardcopy -h filename
Solution 8 - Logging
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
Solution 9 - Logging
The 'script' command under Unix should do the trick. Just run it at the start of your new console and you should be good.
Solution 10 - Logging
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.
Solution 11 - Logging
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
Solution 12 - Logging
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 sec to write the output to a file. 'sudo' part depends of your environment
screen -dm bash -c 'sleep 5;echo "done" | sudo tee ./test.txt'