将屏幕(程序)输出保存到文件

Posted

技术标签:

【中文标题】将屏幕(程序)输出保存到文件【英文标题】:Save Screen (program) output to a file 【发布时间】:2012-12-21 21:26:53 【问题描述】:

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

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

我试过了:

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

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

有什么简单的方法吗?

【问题讨论】:

我使用的生产设置有多个屏幕实例。我需要的输出为“pts/10”。因此,我应该怎么做才能将其输出到文件中? 【参考方案1】:

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

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

【讨论】:

谢谢。有没有办法输出屏幕在其输出缓冲区中已有的内容?例如。我忘了启用日志记录,但滚动屏幕缓冲区中提供了输出 - 如何将其写入文件? 只是用谷歌搜索了一点.. 这是我重复评论的答案 - ***.com/questions/4807474/… Ctrl+A 和 : 进入命令模式,然后硬拷贝 -h 以防其他人需要这个. 日志文件将在您执行screen的同一目录中创建。 昨天我做了一个“screen -L”,断开了我的 SSH 会话,今天再次登录并使用“screen -r”重新连接(我只有一个),退出,然后做了一个 find / -name "screen*log"什么也没找到。 相关:Is it possible to name the screen logfile from the L flag?【参考方案2】:

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

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

【讨论】:

+1。如果无法创建日志,请尝试更改屏幕窗口的工作目录:Ctrl-a + : 并输入例如chdir /home/foobar/baz C-a + H 只是为我切换屏幕窗口。与日志文件无关! @aaa90210 是 ctrl-a,然后单独按 h 以获得硬拷贝。 ctrl-a 然后单独按 shift-h 开始一个完整的日志文件。 寻找由 Ctrl-a H 创建的 screenlog.0 文件? unix.stackexchange.com/questions/198881/…【参考方案3】:

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

screen -L -Logfile Log_file_name_of_your_choice command_to_be_executed

来自man page of 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 版本。

【讨论】:

您也可以将 command_to_be_executed 留空并输入一系列长时间运行的作业 记住对屏幕的工作目录有写权限,否则它会静默失败(只是没有任何警告就不会登录)【参考方案4】:

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

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

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

    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 会将其打印在日志文件中:source。

    以“-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 中创建一个日志文件

【讨论】:

谢谢 - on-the-fly 部分非常有用。 随后,一个屏幕在一夜之间运行,其中一个配置文件在运行中创建和删除,在screen -r"Unable to open "/tmp/log.conf" 上出错。此外,屏幕从[detached] 状态变为不存在。可能是什么问题? 你的命令是做什么的? screen 将在丢失时重新创建日志文件,所以我猜测 /tmp/ 空间不足或有其他一些与操作系统相关的问题?我在几台无限期运行的服务器中使用了这种方法,到目前为止,我至少在 1 年内还没有看到这种情况。如果您愿意,我们可以开始聊天,我可以帮助您调试问题。 我认为你是对的,如果你以这种方式运行进程,它不应该终止屏幕,这与执行:screen bash 相同。如果任何其他进程正在杀死您的屏幕,它应该被列为“死”,但不会消失。我不确定它会是什么。 @qräbnö:不错的收获!一直以来,我都没有注意到。我相应地更新了答案。【参考方案5】:

对于 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

【讨论】:

这对我在 Mac 上不起作用。日志文件显示脚本开始和命令结束,但不显示从屏幕命令接收的数据。【参考方案6】:

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

【讨论】:

Ctrl+A 然后 H . @ShimonDoodkin 我试过了,由于某种原因在 Debian 上不起作用。不过可能对其他人有帮助。谢谢!【参考方案7】:

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

Ctrl-a [ g SPACE G $ >.

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

【讨论】:

这篇文章[1]提供了一个更简单的解决方案:Ctrl + a,然后: 进入命令模式,然后hardcopy -h <filename> 1. ***.com/a/6604296/1734789【参考方案8】:

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

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

【讨论】:

【参考方案9】:

这里有个窍门:把它包裹在sh -c!

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

2>&1 将 stderr 重定向到 stdout,因此 tee 可以捕获和记录错误消息。

【讨论】:

【参考方案10】:

Unix 下的“脚本”命令应该可以解决问题。只需在您的新控制台开始时运行它,您应该就可以了。

【讨论】:

太棒了!它在哪里打印? 它应该只是写入一个文件。命令有点乱,但我认为这可能会解决这个问题:linux.byexamples.com/archives/279/…【参考方案11】:

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

cat /dev/ttyUSB0

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

cat /dev/ttyUSB0 | tee console.log

【讨论】:

这个非常适合我。我正在记录 Arduino 数据捕获会话的串行监视器输出。【参考方案12】:

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

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

【讨论】:

以上是关于将屏幕(程序)输出保存到文件的主要内容,如果未能解决你的问题,请参考以下文章

Linux命令之保存命令结果到文件并且输出到屏幕tee

如何将gcc的错误输出保存到文件

Linux下Shell命令的输出信息同时显示在屏幕和保存到日志文件中

Linux基础之输入输出

输出 XML 文件,不保存

win7将当前屏幕画面保存在考生文件夹