【问题标题】:how to read / copy a tmp file which exists for a very short time如何读取/复制存在时间很短的 tmp 文件
【发布时间】:2014-01-29 09:13:39
【问题描述】:
我的 nginx 为大于 16kb 的请求创建 tmp 文件。我正在尝试读取此 tmp 文件,但它们仅存在很短的时间(1 毫秒?)。是否有 unix 命令/程序可以帮助我在这些文件消失之前阅读它们?
ngnix 警告消息看起来像
a client request body is buffered to a temporary file /var/lib/nginx/body/0000001851
编辑
我无法更改 ngnix 源代码,也无法编辑请求来源的源代码。我只是想看看这些文件以进行调试,因为我无法想象什么样的请求会膨胀到 16k
【问题讨论】:
标签:
shell
nginx
debian
tmp
temporary-files
【解决方案1】:
一般来说,您可能希望获得 nginx 的帮助,或者如果这不可能,那么按照 Leo 的建议更改源代码非常重要。
我提到了一个令人畏缩的、引人入胜的技巧,作为一种好奇心。您可以在目录上设置仅附加模式。如果您的文件系统支持它,您可以说:
chattr +a mydir
您的进程将能够在内部创建内容,但不能将其删除。然后,您可以在闲暇时使用inotify_wait 来监视目录的更改。不过,我不知道有什么干净的方法可以删除这些文件。
【解决方案2】:
您可以尝试使用以下内容解析输出:
stdbuf -oL nginx 2>&1 |
grep -F --line-buffered \
"a client request body is buffered to a temporary file" | {
while read -a line
cp line[${#line[@]}-1] /dest/path
}
虽然你可能会发现这太慢了,文件在你复制之前就消失了。
更好的解决方案可能是使用inotify。 cnicutar 提到的inotify_wait 会起作用。您可以尝试以下方法:
while true
do
file=$(inotifywait -e create --format %f -r /var/lib/nginx/body/)
cp "/var/lib/nginx/body/$file" "/dest/path/$file"
done
如果您没有得到您要查找的内容(例如,如果在写入所有数据之前复制了文件),您可以尝试不同的事件而不是 create,也许是 close、close_write 或modify.