我们有一个正在运行的 Apache HTTP 服务器,它为用户提供动态创建的 zip 档案,这些档案的大小可能为几百兆字节。由于我们每次点击“下载”按钮都会创建一个新文件(即使内容没有改变……),我们很可能会遇到磁盘容量问题。
我运行了一个相当愚蠢的脚本,它会删除 90 多分钟前创建的所有文件。显然这不是一个好的解决方案。
我想知道如何从服务器的命令行确定下载是否成功完成。在这种情况下,我可以删除该文件,因为它不会被重复提供。想想看,甚至可能只需检查服务器是否正在使用文件就足够了,因为它是在提供给客户端之前创建的。
谢谢!
答案1
自从删除进程具有打开文件句柄的文件将使文件保留在那里,直到句柄被关闭您可以立即删除它们,当 Apache 关闭文件时,它将从磁盘中删除。
答案2
TRS-80 的想法是正确的,我绝对建议你遵循这个思路。如果你坚持要等到传输完成,那么可以考虑使用它来lsof
确定何时没有人打开该文件。因此,如下所示:
for file in /directory/full/of/zips/*.zip; do
if [ -z "$(lsof $file)" ]; then
# Nobody's reading it, delete
rm $file
fi
done
答案3
我看到的第一种方法是解析结果服务器状态了解下载是否已开始。下载开始时,您可以按照 TRS-80 所述删除文件。但我不建议这样做,因为如果您的客户端因任何原因断开连接,他将无法重新启动下载。所以我将解析日志文件以了解文件何时下载。直到与客户端的连接关闭后,日志文件中的条目才会添加。在日志文件中,您将获得提供给客户端的八位字节数,以便您可以与文件大小进行比较,以确保他已下载整个文件。
答案4
这不是一个明确的答案,但我首先考虑如何解决这个问题。
我每小时运行一次脚本。此脚本将枚举 Zip 源文件夹中的所有文件名。然后,我会让脚本读取 Apache 日志,查找与当前文件名匹配的某种传输完成条目。如果有匹配的日志条目,则删除该文件。如果没有,则转到下一个文件名。