将屏幕(程序)输出保存到文件
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 和 : 进入命令模式,然后硬拷贝 -hfind / -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'
【讨论】:
以上是关于将屏幕(程序)输出保存到文件的主要内容,如果未能解决你的问题,请参考以下文章