【问题标题】: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”。因此,我应该怎么做才能将其输出到文件中?

标签: logging buffer dump gnu-screen


【解决方案1】:

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

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

【讨论】:

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

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

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

  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 会将其打印在日志文件中: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 中创建一个日志文件

【讨论】:

  • 谢谢 - 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

【讨论】:

【解决方案8】:

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

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

【讨论】:

    【解决方案9】:

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

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

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

    【讨论】:

      【解决方案10】:

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

      【讨论】:

      【解决方案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'
      

      【讨论】:

        猜你喜欢
        • 2014-09-21
        • 1970-01-01
        • 1970-01-01
        • 2015-03-29
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        相关资源
        最近更新 更多