1

我的 nginx 为大于 16kb 的请求创建 tmp 文件。我正在尝试读取此 tmp 文件,但它们仅存在很短的时间(1 毫秒?)。是否有 unix 命令/程序可以帮助我在这些文件消失之前阅读它们?

ngnix 警告消息看起来像

a client request body is buffered to a temporary file /var/lib/nginx/body/0000001851

编辑 我无法更改 ngnix 源代码,也无法编辑请求来源的源代码。我只是想看看这个文件以进行调试,因为我无法想象什么样的请求会膨胀到 16k

4

2 回答 2

3

一般来说,您可能希望获得 nginx 的帮助,或者如果那是不可能的,那么按照 Leo 的建议更改源代码非常重要。


有一个令人畏缩的、引人入胜的技巧,我提到它是一种好奇心。您可以在目录上设置仅附加模式。如果您的文件系统支持它,您可以说:

chattr +a mydir

您的进程将能够在内部创建内容但不能将其删除。然后,您可以在闲暇时使用inotify_wait来监视目录的更改。不过,我不知道有什么干净的方法可以删除文件。

于 2014-01-29T09:28:30.917 回答
-1

好吧,您可以尝试使用以下内容解析输出:

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. inotify_wait正如 cnicutar 所提到的那样会起作用。您可以尝试以下方法:

while true
do
  file=$(inotifywait -e create --format %f -r /var/lib/nginx/body/)
  cp "/var/lib/nginx/body/$file" "/dest/path/$file"
done

如果您没有得到您要查找的内容(例如,如果在写入所有数据之前复制了文件),您可以尝试不同的事件,而不是、createmaybe或.closeclose_writemodify

于 2014-01-29T09:53:25.200 回答