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

190

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

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

我尝试过:

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

我也尝试过从屏幕使用bufferfile,但是我不明白如何使用它。

有没有更简单的方法?


我正在使用的生产环境有多个屏幕实例。我需要输出的那个屏幕的行是“pts/10”。因此,我应该怎么做才能将其输出到文件中? - Sid
12个回答

189

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

'-L' 告诉Screen为窗口开启自动输出日志功能。


11
谢谢。有办法输出屏幕已经在其输出缓冲区中的内容吗?比如,我忘记启用日志记录,但输出可在滚动屏幕缓冲区中使用 - 如何将其写入文件? - Tagar
73
我搜索了一些内容.. 这是我之前评论的答案 - https://dev59.com/5G445IYBdhLWcg3wiq4i 使用 Ctrl+A 和 : 进入命令模式,然后执行hardcopy -h <文件名>以备其他需要者参考。 - Tagar
6
日志文件将会在执行screen命令的同一目录下创建。 - lepe
2
昨天我执行了一个“screen -L”命令,断开了我的SSH会话,今天重新登录并使用“screen -r”重新连接(我只有一个),退出后执行了“find / -name“ screen * log””,但没有找到任何内容。 - pacoverflow
4
可以使用-L选项来指定screen会话的日志文件名。使用如下命令:screen -L /path/to/logfile这将在运行screen时创建一个名为“/path/to/logfile”的文件,并将该文件用作日志文件。 - lepe
显示剩余4条评论

139

您还可以使用Ctrl+A,H将日志保存到screenlog.n文件中。

再次使用Ctrl+A,H关闭日志记录。

Ctrl+A,H: 开始/结束将当前窗口的日志记录到文件“screenlog.n”中。


7
如果无法创建日志文件,则尝试更改屏幕窗口的工作目录:Ctrl-a + :,然后输入例如 chdir /home/foobar/baz - Chriki
3
C-a + H 只是切换屏幕窗口,与日志文件无关! - aaa90210
6
@aaa90210 这里是一些快捷键操作:按下 Ctrl-a 键,然后再按下 h 键可以进行硬拷贝。同时按下 Shift-h 可以开始记录完整的日志文件。 - James
1
寻找由Ctrl-a H创建的screenlog.0文件? - straville

61

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

screen -L -Logfile Log_file_name_of_your_choice command_to_be_executed

来自 Screen 的 man 页面

-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”留空并输入一系列长时间运行的作业。 - devssh
1
请记得在屏幕的工作目录中拥有写入权限,否则它会默默失败(没有任何警告而不记录)。 - okrutny

26

选定的答案在多个会话中不太有效,并且不允许指定自定义日志文件名称。

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

  1. Create a configuration 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 ]
    ...
    

我发现即使在配置文件中开启了“log on”,仍然需要使用“-L”参数。

我找不到screen使用的时间格式变量(如%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中创建一个日志文件。


2
谢谢 - on-the-fly 部分非常有用。 - Ram RS
1
跟进一下,一个屏幕在夜间运行,使用动态创建和删除的配置文件,在screen -r时出现错误,显示为“无法打开“/tmp/log.conf””。此外,该屏幕从“[detached]”状态变为不存在。可能是什么问题? - Ram RS
1
你的命令是做什么的?当日志文件丢失时,屏幕将重新创建该文件,所以我猜测/tmp/空间不足或存在其他与操作系统相关的问题?我在多台无限运行的服务器上使用这种方法,至少一年来我还没有遇到过这种情况。如果你想的话,我们可以开始聊天,我可以帮助你调试你的问题。 - lepe
1
我认为你是对的,如果你以这种方式运行进程,它不应该终止屏幕,这与执行 screen bash 相同。如果任何其他进程正在杀死你的屏幕,它应该被列为“死亡”,但不会消失。我不确定它可能是什么。 - lepe
1
@qräbnö:好发现!这么长时间我都没注意到。我已经相应地更新了答案。 - lepe
显示剩余8条评论

22

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

Ctrl+A : hardcopy -h 文件名


我应该在会话期间保持站立吗? - Volatil3

18

对于Mac终端:

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

详细信息

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

然后,您可以使用tail查看文件是否正在更新。

tail -100 out.txt

1
这在我的 Mac 上没有起作用。日志文件显示脚本启动了 common,命令结束了,但是没有从 screen 命令接收到数据。 - David

13

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


1
Ctrl+A 然后 H。 - Shimon Doodkin
1
@ShimonDoodkin 我尝试过了,但不知何故在Debian上无法工作。但这可能对其他人有帮助。谢谢! - jaggedsoft
@jaggedsoft,那个文件是在哪里创建的?路径是什么? - Volatil3

11

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

Ctrl-a [ g SPACE G $ >.

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


4
这篇帖子[1]提供了一个更简单的解决方案:使用Ctrl + a进入命令模式,然后输入:,接着使用hardcopy -h <filename> - Tarjei Huse

8
这里有一个技巧:将其包装在sh -c中!
screen sh -c './some-script 2>&1 | tee mylog.log'

2>&1 中,将标准错误重定向到标准输出,以便 tee 可以捕获并记录错误消息。


7
在Unix下,“script”命令应该可以解决问题。只需在新控制台的开头运行它,就可以了。

太好了!它打印在哪里? - Edoardoo
它应该只是写入一个文件。命令有点凌乱,但我认为这可能会解决一些问题:http://linux.byexamples.com/archives/279/record-the-terminal-session-and-replay-later/ - Ruben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接