1
AoEiuV020 2021-05-06 16:34:29 +08:00
感觉上没有办法,删除了就是删除了,从 fd 复制出来的也是新文件了,原进程读取的还是原文件,这了是原进程 fd 能复制出已删除文件原原因,
至于 tail 能看到新文件,那只是因为 fd 里是软链接,新的 tail 进程解析软链接得到了新文件, 原进程要读新文件应该只能关闭 fd 重新读了, |
2
zhoudaiyu OP @AoEiuV020 #1 谢谢您,我还有个疑问,就是源文件被删除了之后,fd 里面看到的软链文件内容是写到哪里了?
|
3
sujin190 2021-05-06 17:09:27 +08:00
这个应该是打开没有完全关闭的文件并不会真的从磁盘删除,只是文件系统不能检索了,也就是删除了名称,实在不行你可以用 tail 啥的再次打开这个文件描述符占着,然后关闭你写文件这个进程,然后用 tail 打开的文件描述符复制文件到新文件,然后再启动刚才那个进程就行吧
|
4
AoEiuV020 2021-05-06 17:12:17 +08:00 1
@zhoudaiyu 原地址吧,毕竟文件删除只是删除文件头,不影响文件本身的数据,原进程拿着原 fd 继续操作的话,动的也还是原来数据所在位置,
这很容易验证,给 bar.txt 创建一个硬链接,然后删除 bar.txt ,fd 目录里的软链接解析出来的也是 deleted,但原进程继续写入内容的话,就能看到这个硬链接内容变化了, |
5
zhoudaiyu OP @sujin190 #3 感觉可以这样 先 tail 文件描述符重定向到 file1,然后把 fd 拷贝到 file2,重启业务,然后再合并一下 file1 与 file2 (可能需要人工,且假定文件只追加新的内容不修改之前写入的)
|
6
billlee 2021-05-06 22:01:21 +08:00
ln -L /proc/1000/fd/6 /foo/bar.txt
|
8
iwishing 2021-05-07 11:12:56 +08:00
|
10
billlee 2021-05-07 20:53:39 +08:00
@zhoudaiyu
1. /proc/1000/fd/6 是指向原文件的(伪)符号连接 2. -L 是符号连接解引用,获得原文件 3. ln 在 /foo/bar.txt 处创建原文件的硬连接 UNIX 任何 dentry 都是指向某个 inode 的硬连接 |
11
buf1024 2021-05-08 09:45:24 +08:00
换个思路,从源头上禁止删除,至少有两种做法:
1. 创建特定的用户,用特定的用户启动程序,读写文件 2. 用 chattr 更改文件属性,使其不能被删除。 |