将输出写入文件,类似于“script”命令?

将输出写入文件,类似于“script”命令?

有没有类似于“脚本”但不需要打开终端的东西?

我想将程序的结果保存到文件中,但是我遇到了一些问题。我需要远程工作,但互联网连接状况不佳。因此我通常运行:

./MyProgram.exe > output.txt &

我的程序的结果保存到output.txt 文件中。

但是,当我在某些对象上运行程序时,我收到“SIGSEGV:分段错误”错误。程序退出了,没关系,我知道它会这样做。但在程序遇到这个导致错误的有问题的对象之前,我最终丢失了以前对象的所有数据。

如何将所有内容(无问题对象的结果以及此错误)记录到一个文件中?

我努力了:

./MyProgram.exe > output.txt 2>&1 &

./MyProgram.exe > output.txt 2> error.txt &

./MyProgram.exe > & error-n-output.txt &

但以上所有内容都只是记录分段错误,而不是先前对象的结果,即使我知道该程序确实适用于先前的对象。

我还尝试过script输入以下命令:

我的名字@计算机 ~/文件夹 $script screen.log
脚本已启动,文件为 screen.log
我的名字@计算机 ~/文件夹 $./MyProgram.exe
~~~结果和分段错误打印在屏幕上,这样我就可以记录某些对象的结果并忽略错误~~
我的名字@计算机 ~/文件夹 $exit
exit
脚本完成,文件为 screen.log

屏幕上的所有内容都记录在 screen.log 文件中。这可能没问题,但是,由于我的互联网连接不好,我无法让屏幕长时间运行。我需要从终端退出,但当然我的程序退出了,并且“screen.log”文件中没有写入任何内容。

有没有类似script但不需要打开终端的东西?

答案1

nohup可能就是你想要的。nohup的目的是“运行命令,忽略挂断信号”。换句话说,如果您的sshtelnet、串行等连接因任何原因断开(当然,主机崩溃、关闭或重新启动除外),您的程序将继续运行。

您可能还想nohup在后台运行 -ed 命令(使用&),因为所有输出都将重定向到文件。

例如:

nohup MyProgram.exe &

默认情况下,它会将输出保存到./nohup.out~/nohup.out,但如果需要,您可以重定向到其他文件。从手册页:

如果标准输入是终端,则将其从不可读文件重定向。如果标准输出是终端,则nohup.out尽可能将输出附加到,$HOME/nohup.out否则。如果标准错误是终端,则将其重定向到标准输出。要将输出保存到 FILE,请使用nohup COMMAND > FILE

nohup最适用于不需要用户输入的非交互式程序。

如果您需要运行直接与用户交互的程序(例如ncurses应用程序),请使用终端多路复用器,例如 GNU屏幕, 或者多路复用器, 或者屏风或类似的代替nohup

终端多路复用器不仅使您的程序不受挂断信号的影响,还允许您在断开连接后再次登录时重新连接到同一 shell 会话(以及正在运行的程序)。它们还可以通过一个连接启用多个 shell 会话(例如,通过 ssh 连接到远程计算机,运行screen,您可以根据需要创建、销毁以及在任意数量的 shell“窗口”之间切换)。

顺便说一句,这些程序都为您提供了标准 shell,因此您可以script选择在其中运行。

我已经链接到这些程序的主页,但您可能不需要编译它们来安装 - 它们可以作为大多数(全部?)Linux 发行版、FreeBSD、Mac OS X、solaris 的预编译包提供, 和更多。

答案2

当您想附加到标准输出时,您可以使用>>而不是仅仅使用>

./MyProgram.exe >> output.txt 2> error.txt &

这将防止您的输出每次都被覆盖。

这显然不会阻止进程在会话关闭时退出。如果nohup可用,您应该使用它来启动您的程序,即使会话关闭,它也将允许程序继续运行。

答案3

尝试命令

stdbuf -oL ./MyProgram.exe > output.txt

默认情况下,如果输出是终端,则程序的标准输出是行缓冲的,但如果输出是常规文件,则以 4kB 块的形式缓冲(现在就是这种情况,因为您将其重定向到 output.txt)。

这意味着标准 stdio 函数(例如 printf())在实际写出数据之前会收集最多 4kB 的数据。如果你的实用程序崩溃了——太糟糕了——最后一个尚未写出的块就会丢失。

stdbuf -oL将标准输出设置为行缓冲,即使输出转到常规文件也是如此。

(尽管毫无疑问,最干净的解决方案是修复您的应用程序以免崩溃。)

您可以进一步将其与nohup或结合起来screen,如其他答案所示。

答案4

只需尝试以下操作:

program.exe &> /temp/output.log ;
# OR #
program.exe &> /temp/output.log &

在某些情况下,您可能希望密切关注它的变化,例如:

watch cat /temp/output.log
# OR #
watch --diff cat /temp/output.log

或者类似地:

watch tail /temp/output.log
# OR #
watch --diff tail /temp/output.log

确定您到底想要什么有点困难,但您可能会发现以下实用程序很有用:

script
# OR #
asciinema

如果这一切都失败了——你可能应该考虑使用调试器、反编译器、反汇编器等。

让我知道你的进展如何,我将相应地调整这篇文章。

相关内容