为什么打开删除文件的文件句柄会填满硬盘

2021-02-19 11:55

所以,长话短说,我编写了一个(python)程序,打开了很多文件,在其中写入数据,然后删除了文件,但没有正确关闭文件把手。之后一些时间,由于磁盘空间不足,此

解答动态

  • 在Unix中删除文件只是删除对其数据的命名引用(因此系统调用名为unlink/unlinkat,而不是delete)。为了释放数据本身,必须没有对它的其他引用。参考资料可以在一些方法:一定要有不要在文件系统上进一步引用这些数据(stnlink必须为0)--硬链接时可能会发生这种情况。否则,我们会在仍然有办法从服务器访问数据时丢弃数据文件系统。那里不能从打开的文件句柄进一步引用此数据(在Linux上,内核中相关结构文件的fèu计数必须为0)。否则,仍然可以通过读取或写入文件句柄(或Linux上的/proc/pid/fd)来访问或修改数据,我们需要某个地方继续存储它。 一旦满足这两个条件,数据就可以被释放。由于您的案例违反了条件#2—您仍然有打开的文件句柄—数据继续存储在磁盘上(因为它没有其他地方可去),直到文件句柄关闭。
    有些程序甚至使用此方法来简化数据清理。例如,假设一个程序需要在磁盘上存储一些大数据以进行中间工作,但不需要与其他程序共享。如果它打开并立即删除该文件,它就可以使用它,而不必担心确保它们在退出时被清除——在关闭(fd)或退出时,打开的文件描述符引用计数将自然下降到0,并且无论程序是否正常退出,相关空间都将被释放。
    detection 删除的文件仍在运行可以使用lsof找到由文件描述符保持打开的文件,使用类似以下:
    %lsof-nP+l1命令PID USER FD TYPE DEVICE SIZE/OFF NLINK NODE namespulseaudi 1799 cdown 6u REG 0,1 67108864 0 1025/成员:pulseaudio(已删除)chrome 46460 cdown 45r REG 0,27 131072 0 105357/dev/shm/。谷歌浏览器.gL8tTh(已删除) 此列表列出了所有打开的文件,这些文件的st\n链接值小于1。
    缓解 在您的情况下,您可以通过终止进程来关闭文件句柄,如果可能,这是一个很好的解决方案。
    在不可能的情况下,在Linux上,您可以通过/proc/pid/fd访问文件描述符支持的数据,并将其截断为0大小,即使文件已经被删除删除:
    :quot;/proc/pid/fd/$num“设备上没有剩余空间”是ENOSPC,这是文件系统空间不足时我们生成的。如果达到文件描述符,则会收到EMFILE(进程级短缺,由strerror呈现为“打开的文件太多”)或ENFILE(系统级短缺,由strerror呈现为“系统中打开的文件太多”)。进程级软可以用ulimit-Sn检查,系统级可以在/proc/sys/fs/file-max.
    中查看

    • End

    免责声明:

    本页内容仅代表作者本人意见,若因此产生任何纠纷由作者本人负责,概与琴岛网公司无关。本页内容仅供参考,请您根据自身实际情况谨慎操作。尤其涉及您或第三方利益等事项,请咨询专业人士处理。