将 Screen (程序)输出保存到文件中

我需要保存 屏幕的整个输出到一个文件,以便稍后检查所有的内容。

原因是我通过串行端口转储一个闪存,使用屏幕与它接口。我想保存到一个文件,以检查内存结构。

我试过了:

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

我也尝试过使用 screen 中的 buffer 文件,但是我不知道如何使用它。

有简单的办法吗?

259082 次浏览

Unix 下的“ script”命令应该可以解决这个问题。只要在新控制台的开始运行它,就应该没问题了。

还可以使用 Ctrl + AH将日志保存到 截屏文件中。

再来一个 Ctrl + AH关掉它。

Ctrl + AH: 将当前窗口的日志记录到文件“ screen log.n”的开始/结束。

以下内容可能有用(在 Linux/Ubuntu 12.04(精确穿山甲)上测试) :

cat /dev/ttyUSB0

使用上面的命令,您可以执行所有需要的重定向操作。例如,要在保存到文件的同时将输出转储到控制台,您需要:

cat /dev/ttyUSB0 | tee console.log

有一个用于日志记录的命令行选项。输出保存到 screen log.n 文件中,其中 n 是屏幕的一个数字。 来自手册页的屏幕:

告诉屏幕为窗口打开自动输出日志。

对于 Mac 终端:

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

细节

  • script: 一个内置的应用程序,用于“制作终端会话的打字脚本”
  • -a: 附加到输出文件
  • -t 0: 写入输出文件的间隔时间为0秒,因此每个新字符都会更新 out.txt
  • out.txt: 只是输出文件名
  • screen /dev/ttyUSB0 115200: 连接外部设备的命令

然后可以使用 尾巴查看文件是否正在更新。

tail -100 out.txt

所选择的答案不能很好地处理多个会话,并且不允许指定自定义日志文件名。

对于多个屏幕会话,这是我的公式:

  1. 为每个进程创建一个配置文件:

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

    如果你想做到这一点“在飞”,你可以改变 logfile自动。 \012表示“新行”,因为使用 \n将在日志文件中打印它: 来源

  2. 使用“-c”和“-L”标志启动命令:

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

    就是这样。在第一次刷新后,您将看到“ test.log”:

    ...
    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

要使用它,保存它(screen. sh)并设置 + x 权限:

./screen.sh TEST ./test.pl

... 并将执行./test.pl 并在/var/log/TEST.log 中创建一个日志文件

Ctrl+A然后 Shift+H为我工作。你可以查看文件 screenlog.0,而程序仍然在运行。

以下命令适用于 Screen 版本4.06.02:

screen -L -Logfile Log_file_name_of_your_choice command_to_be_executed

来自 屏幕的手册页:

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

您可以使用 屏幕版本检查 屏幕的现有版本。您可以从 https://www.gnu.org/software/screen/下载并安装最新的 屏幕版本。

这里有一个技巧: 包装它在 sh -c

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

其中,2>&1将 stderr 重定向到 stdout,这样 tee就可以捕获并记录错误消息。

如果您需要从一个已经在运行的屏幕中保存整个回滚缓冲区的输出,那么另一个不同的答案是:

Ctrl-a [ g SPACE G $ >.

这将把整个缓冲区保存到/tmp/screen-exchange

现有的屏幕日志可以通过以下方式保存:

Ctrl+A :硬拷贝-h 文件名

我花了很多钱才找到一个干净的解决办法。虽然以前的回复是好的,我发现这是更直接的。

此命令将等待5秒钟将输出写入文件。“ sudo”部分取决于您的环境。

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