我的网络服务正在运行nginx
并php
使用标头将文件传送X-Accel-Redirect
到客户端,如果我使用它,rm /my/folder/*.*
它将如何处理客户端当前正在访问/下载的文件?
答案1
当进程开始读取文件时,它会创建一个附加到文件所在的 inode 的文件句柄。
删除文件时,会删除从目录到 inode 的链接。该链接将立即被删除,因此其他进程将无法找到该文件。
但是,只要有指向该 inode 的活动文件句柄,则使用该文件句柄的进程仍可访问其内容。一旦所有拥有指向该 inode 的文件句柄的活动进程都关闭了其文件句柄,则文件所在的空间将被标记为空。
您可以将文件名视为一种符号链接。
- 你有一个名为的文件
/inodes/1234
,你将其符号链接到/myapp/myfile.txt
- 你打开
/myapp/myfile.txt
。实际上你打开了,/inodes/1234
因为那是实际的文件。 - 您删除了符号链接
/myapp/myfile.txt
。原始文件/inodes/1234
仍然存在,并且在步骤 2 中打开它的进程仍在读取/访问它。 - 另一个进程请求
/myapp/myfile.txt
。它不存在,因为您删除了符号链接。(/inodes/1234
当然,原始文件仍然存在!) - 第二个进程想要创建
/myapp/myfile.txt
。操作系统创建文件/inodes/4711
并创建一个符号链接至/myapp/myfile.txt
当然,它比这稍微复杂一些,但在这种情况下它是一个有用的模型。
顺便说一句,这也是对这个问题的回答“为什么即使我删除了这个巨大的日志文件,并且没有其他东西占用空间,我的磁盘仍然满了”——如果一个进程仍在读取或写入该文件,你只是让它不可见,你实际上并没有清除它。