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 trough 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?
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.
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".
for mac terminal:
script -a -t 0 out.txt screen /dev/ttyUSB0 115200
details
script
built in app 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 char
out.txt
is just the output file name
screen /dev/ttyUSB0 115200
- command from question for connecting to external device
you can then use tail to see that the file is updating
tail -100 out.txt
The selected answer doesn't work quite well with multiple sessions and doesn't allows to specify a custom log file name.
For multiple screen sessions, this is my formula:
1) create a config 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 config 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
The following command works for screen version 4.06.02
screen -L -Logfile Log_file_name_of_your_choice command_to_be_executed
From man page of the 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 latest screen version from https://www.gnu.org/software/screen/.
Ctrl+A then Shift+H works for me. You can view the file screenlog.0
while the program is still running.
The 'script' command under Unix should do the trick. Just run it at the start of your new console and you should be good.
The following might be useful (Tested on: Linux/Ubuntu 12.04):
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 whilst saving to your file, you'd do:
cat /dev/ttyUSB0 | tee console.log
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.