160

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

原因是我正在通过串行端口转储闪存,使用 Screen 与之交互。我想将其保存到文件中以检查内存结构。

我试过了:

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

而且我也尝试过从屏幕使用缓冲区文件,但我不明白如何使用它。

有没有简单的方法?

4

12 回答 12

160

有一个用于记录的命令行选项。输出保存到 screenlog.n 文件,其中 n 是屏幕的编号。从屏幕的手册页:

'-L' 告诉屏幕打开窗口的自动输出记录。

于 2014-03-06T14:46:50.063 回答
125

您还可以使用 Control-a + H 将日志记录保存到 screenlog.n 文件中。再按一次 Control-a + H 关闭。

Ca H:开始/结束将当前窗口记录到文件“screenlog.n”。

于 2013-07-22T07:05:24.530 回答
39

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

screen -L -Logfile Log_file_name_of_your_choice command_to_be_executed

Screen 的手册页

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

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

于 2018-02-05T00:05:31.400 回答
25

所选答案不适用于多个会话,并且不允许指定自定义日志文件名。

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

  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表示“新行”,因为 using\n会将其打印在日志文件中:source

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

我发现即使配置文件上有“登录”,仍然需要“-L”。

我找不到屏幕使用的时间格式变量列表(如 %m)。如果您有这些格式的链接,请在下面发布。

额外的

如果您想“即时”执行此操作,可以使用此脚本:

#!/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 中创建一个日志文件

于 2016-06-01T04:16:00.833 回答
17

对于 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查看文件是否正在更新。

tail -100 out.txt
于 2014-09-29T06:36:58.630 回答
11

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

于 2017-07-16T16:53:42.800 回答
9

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

Ctrl-a [ g SPACE G $ >.

这会将您的整个缓冲区保存到 /tmp/screen-exchange

于 2020-02-07T20:00:17.770 回答
7

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

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

于 2020-05-29T12:24:51.683 回答
6

这里有个窍门:把它包起来sh -c

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

where2>&1将 stderr 重定向到 stdout,以便tee捕获和记录错误消息。

于 2018-07-13T08:48:50.400 回答
5

Unix 下的“脚本”命令应该可以解决问题。只需在新控制台的开始处运行它,你应该会很好。

于 2013-01-08T04:05:43.780 回答
5

以下可能有用(测试于:Linux/ Ubuntu 12.04(Precise Pangolin)):

cat /dev/ttyUSB0

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

cat /dev/ttyUSB0 | tee console.log
于 2014-02-13T23:33:53.977 回答
0

找到一个干净的解决方案花了我很多钱,虽然以前的回复很好,但我发现这更直接。此命令将等待 5 秒以将输出写入文件。'sudo' 部分取决于您的环境

screen -dm bash -c 'sleep 5;echo "done" | sudo tee ./test.txt'
于 2021-11-19T13:12:06.347 回答