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


130

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

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

我试过了:

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

而且我也尝试过从屏幕上使用bufferfile,但我不知道如何使用它。

有没有简单的方法?


我使用的生产设置具有多个屏幕实例。我需要其输出的行的行号为“ pts / 10”。因此,我应该怎么做才能获得其输出到文件?
2016年

Answers:


129

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

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


6
谢谢。有没有一种方法可以输出输出缓冲区中已经存在的屏幕?例如,我忘了启用日志记录,但是在滚动屏幕缓冲区中有可用输出-如何将其写入文件?
塔加尔,2015年

48
只是一派多一点。这里的答案我repvious评论- stackoverflow.com/questions/4807474/...按Ctrl + A和:去命令模式,然后硬拷贝-h <文件名>的情况下,有人elsee都需要这个。
塔加尔2015年

3
日志文件将在执行屏幕的同一目录中创建。
lepe 2016年

1
昨天我做了一个“ screen -L”,断开了我的SSH会话,今天再次登录并使用“ screen -r”(我只有一个)重新连接,退出了,却没有find / -name "screen*log"发现任何结果。
pacoverflow '16


104

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

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


5
+1。如果无法创建日志,请尝试更改屏幕窗口的工作目录:Ctrl- a+ :并键入例如chdir /home/foobar/baz
Chriki

2
Ca + H只是为我切换屏幕窗口。与日志文件无关!
aaa90210 '17

2
@ aaa90210是ctrl-a,然后单独按h以获得硬拷贝。Ctrl-a,然后单独按shift-h,将启动完整的日志文件。
詹姆斯

1
寻找Ctrl-a H创建的screenlog.0文件吗?unix.stackexchange.com/questions/198881/…–
straville

20

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

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

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


1
谢谢-这on-the-fly部分非常有用。
Ram RS

1
后续行动,以建立和动态删除的配置文件的屏幕在夜间运行出错了一个screen -r具有"Unable to open "/tmp/log.conf"。此外,屏幕从[detached]状态变为不存在。可能是什么问题?
拉姆RS

1
您的命令做什么?屏幕丢失时将重新创建日志文件,所以我猜/ tmp /空间不足或有其他与操作系统相关的问题?我在无限期运行的几台服务器中使用了这种方法,到目前为止,至少一年都没有出现这种情况。如果您愿意,我们可以开始聊天,我们可以帮助您调试问题。
lepe 16-10-14

1
我认为您是对的,如果您以这种方式运行进程,则不应终止屏幕,这与执行:相同screen bash。如果有任何其他进程正在杀死您的屏幕,则应将其列为“已死”,但不会消失。我不确定会是什么。
lepe

1
@qräbnö:不错!这些时间我一直没注意到。我相应地更新了答案。
lepe

20

以下命令适用于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版本。


您也可以将command_to_be_executed保留为空白,并输入一系列长期运行的作业
devssh,

请记住对屏幕的工作目录具有写权限,因为否则它会以静默方式失败(只是没有任何警告就不会登录)
okrutny

15

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

1
在Mac上,这对我不起作用。日志文件显示脚本以公共命令开头,命令结束,但不显示从screen命令接收的数据。
大卫

10

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


1
按Ctrl + A,然后按H。
Shimon Doodkin '18

1
@ShimonDoodkin我尝试过,由于某种原因在Debian上不起作用。可能对其他人有帮助。谢谢!
jaggedsoft


5

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

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

2>&1stderr重定向到stdout,从而tee可以捕捉和记录的错误消息。


5

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

cat /dev/ttyUSB0

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

cat /dev/ttyUSB0 | tee console.log

这个完美地为我工作。我正在记录来自Arduino数据捕获会话的串行监视器输出。
伊恩·皮茨

3

如果您需要从已经运行的屏幕上保存整个回滚缓冲区的输出,则可以使用其他答案:

Ctrl-a [ g SPACE G $ >.

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.