Shell 脚本:如何复制终端模拟器过去的输出?

Shell 脚本:如何复制终端模拟器过去的输出?

我想制作一个 shell 脚本来复制 GUI 终端仿真器过去的输出(例如,最后 20 行)。动机如下:

当我执行一个需要很长时间的程序时(例如,下载一个非常大的文件,或者转换一个非常大的电影文件),有时我会想起另一项工作,并且必须离开房间。在这种情况下,我按 ctrl+z 来停止该过程。我输入

fg; echo $? >> log.txt; date >> log.txt; systemctl poweroff

然后我离开房间。

这种方法有效而且还不错。但它有一个缺点,我无法读取程序的输出。我只能知道状态($?)。所以我想复制最后 20 或 40 行并将它们保存在日志文件中。

答案1

首先使用nohup,screen或运行命令。tmux当然,如果您已经开始您的流程,这将无济于事。

如果是这种情况,您可以使用以下命令捕获命令的输出strace

strace -p<PID> -s9999 -e write  2>&1 | grep -o '".\+[^"]"'

(替换<PID>PID您的流程的)


如果strace无法附加到进程,您可能需要运行 as root/ withsudo更改您的 ptrace 设置0并注意它的安全影响!):

echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

然后您可以将该输出重定向到文件。


还有其他选项,例如gdbreredirect看这里或者这里

相关内容