我刚刚意识到发生了一些相当愚蠢的事情(我这边)。我目前正在多台机器上运行多个程序,同时附加它们的输出。
例如,machine01 正在运行“./calc 1 >> calc_one.txt”,machine02 正在运行“./calc 2 >> calc_two.txt”等。
这些计算运行了很长时间,我刚刚发现发生了一些烦人的事情。我正在使用 git,并且在许多机器上运行这些程序。我编写了程序的新模式并调用在 machine03 上运行它。
因为我使用的是git,所以我认为是保存删除目录中的.txt文件。
我刚刚意识到机器分享一个目录。所以我删除了“calc_one.txt”和“calc_two.txt”,输出被附加到其中。
现在,这些程序实际上只在以下位置打印输出:结尾。程序中有大量线程(OMP),这些线程生成结果(C++向量),这些结果在所有线程完成后打印。
因此,流仍然会来。但使用 BASH 和“睡眠”进行的实验表明,替换 .txt 文件不会使其追加到新文件中。我能做什么或者我需要从头开始这些模拟吗?
衷心感谢您的帮助,戴莫妮
PS:系统是fedora。我没有管理权限。
答案1
1.获取进程PID。例如:
pgrep calc
2.查找已删除的文件。例如:
find /proc/12345/fd -ls | grep '(deleted)'
# or (no pid)
lsof | grep calc_one.txt
# ...
lsof -p 12345
3. a) 复制文件(来自之前的结果,此处3
)。快照:
cp /proc/12345/fd/3 mycopy1.txt
3.b) 新的附加文件:
tail -c +0 -f /proc/12345/fd/3 > mycopy2.txt
在哪里:
-c +K
,输出从第K个字节开始的字节。因为我们想要整个文件,所以我们说 +0
-f
,跟随。随着文件的增长输出附加数据。