中断linux命令重定向可以丢失数据吗?

时间:2015-09-15 03:34:53

标签: c linux bash

如果我运行这样的bash脚本,并且在脚本中,它将调用一些可执行命令,例如以下

myexec args1 arg2 > out.txt

myexec将通过c API printf打印一些日志信息。如果我中断脚本,因为myexec被某些未知原因卡住了,是否会丢失一些日志信息,而不是保存到out.txt文件中?在我的实验中,我发现它是,但有什么方法可以解决这个问题吗?我不知道为什么日志信息没有刷新到ou​​t.txt文件

======

我使用stdbuf解决了我的问题,相关的问题是:Force line-buffering of stdout when piping to tee

2 个答案:

答案 0 :(得分:3)

当您中断脚本时,stdout缓冲区很可能不会被刷新。在您的程序中,在每printf之后立即添加fflush(stdout)以刷新缓冲区。或者,在\n的末尾添加换行符(printf) - 也会刷新缓冲区(但会在日志输出中添加换行符)。

答案 1 :(得分:1)

您可以指定正确完成程序的信号( SIGUSR1, SIGUSR2 等,但您无法覆盖SIGKILL)。在信号处理程序中刷新输出流(fflush(stdout)或替代品)并关闭应用程序。 要停止你的程序类型,如

  

kill -SIGUSR1 pidof myapp