输出重定向应重新创建目标文件

时间:2018-05-08 05:32:52

标签: linux bash

我可以将进程的输出重定向到文件

./prog > a.txt

但是如果我删除了a.txt并且没有重新启动prog,那么没有更多的输出将进入a.txt。如果我使用append-redirect>>。

,情况也是如此

有没有办法让我的重定向在prog的运行时被删除时重新创建文件?

重定向是我认为的操作系统的一部分,而不是编程。所以也许有一些工具或设置。

谢谢!

2 个答案:

答案 0 :(得分:3)

在操作系统级别,文件由许多组件组成:

  • 内容,存储在存储设备的某处;
  • 保存除名称之外的所有文件信息的i-node;
  • 名称,列在目录中(也存储在存储设备上);
  • 当文件打开时,打开它的每个应用程序都会处理保留一些文件内容的内存缓冲区。

所有这些都是相关的,操作系统会保留预订。

如果您在另一个应用程序打开文件时删除该文件(重定向操作符>将其保持打开状态直到./prog完成),则只会从目录中删除该名称。拼图的其他部分仍然存在,并且它们一直工作,直到保持文件打开的最后一个应用程序关闭它。这是在存储介质上丢弃文件内容的时候。

如果删除文件,当./prog继续运行并生成输出时,文件会增长并占用存储介质上的空间,但由于无法访问它,因此无法再次打开。只有删除它时已经打开的程序仍然可以访问该文件,直到它们关闭它为止。

即使您重新创建文件,它也是一个与删除文件同名的不同文件。 ./prog不受影响,其输出将转到旧的已删除文件。

当重定向其输出时,除了重新启动./prog之外,当删除a.txt时,无法说服它将其输出存储在不同的文件中。

如果./prog将自己写入a.txt(它们都需要更改./prog的代码),有几种方法可以实现这一点。

答案 1 :(得分:1)

删除原始文件后,您可以使用gdb将程序的输出重定向到文件。

请参阅此post

对于以后的参考,我给出了帖子的唯一摘录:

  1. 使用/proc/<pid>/fd查找由进程打开的文件。
  2. 将程序的PID附加到gdb
  3. 通过gdb会话关闭已删除文件的文件描述符。
  4. 使用gdb调用将程序输出重定向到另一个文件。

示例

假设程序的PID为19080,删除文件的文件描述符为2。

gdb attach 19080

ls -l /proc/19080/fd

gdb> p close(2) 
$1 = 0
gdb> p fopen("/tmp/file", "w")
$2 = 20746416
(gdb) p fileno($2)
$3 = 7
gdb> quit

N.B。::如果需要已删除文件的数据,请在关闭文件句柄之前恢复已删除的文本文件: cp -pv /proc/19080/fd/2 recovered_file.txt