【问题标题】: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,也许是 closeclose_writemodify.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-13
        • 2020-02-26
        • 2011-01-16
        • 1970-01-01
        • 2014-01-23
        • 1970-01-01
        相关资源
        最近更新 更多