IOError:设备上没有剩余空间-哪个设备?

2024-05-19 06:22:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在上传一个小文件(8.5 Mb)到一个烧瓶测试服务器。

文件上载完成后,服务器将报告:

    File "/home/ubuntu/.virtualenvs/eco_app/lib/python2.7/site-packages/wtforms/form.py", 
        line 212, in __call__
    return type.__call__(cls, *args, **kwargs)
    File "/home/ubuntu/.virtualenvs/eco_app/lib/python2.7/site-packages/flask_wtf/form.py", line 49, in __init__
        formdata = request.form
    File "/home/ubuntu/.virtualenvs/eco_app/lib/python2.7/site-packages/werkzeug/local.py", 
        line 338, in __getattr__
    return getattr(self._get_current_object(), name)
    File "/home/ubuntu/.virtualenvs/eco_app/lib/python2.7/site-packages/werkzeug/utils.py", 
         line 71, in __get__
    value = self.func(obj)
    File "/home/ubuntu/.virtualenvs/eco_app/lib/python2.7/site-packages/werkzeug/wrappers.py", 
         line 484, in form
    self._load_form_data()
    File "/home/ubuntu/.virtualenvs/eco_app/lib/python2.7/site-packages/flask/wrappers.py", 
        line 165, in _load_form_data
    RequestBase._load_form_data(self)
    File "/home/ubuntu/.virtualenvs/eco_app/lib/python2.7/site-packages/werkzeug/wrappers.py", 
        line 356, in _load_form_data
    mimetype, content_length, options)
    File "/home/ubuntu/.virtualenvs/eco_app/lib/python2.7/site-packages/werkzeug/formparser.py", 
        line 193, in parse
    content_length, options)
    File "/home/ubuntu/.virtualenvs/eco_app/lib/python2.7/site-packages/werkzeug/formparser.py",
        line 99, in wrapper
    return f(self, stream, *args, **kwargs)
    File "/home/ubuntu/.virtualenvs/eco_app/lib/python2.7/site-packages/werkzeug/formparser.py",
        line 210, in _parse_multipart
    form, files = parser.parse(stream, boundary, content_length)
    File "/home/ubuntu/.virtualenvs/eco_app/lib/python2.7/site-packages/werkzeug/formparser.py", 
        line 520, in parse
    return self.cls(form), self.cls(files)
    File "/home/ubuntu/.virtualenvs/eco_app/lib/python2.7/site-packages/werkzeug/datastructures.py", 
        line 373, in __init__
    for key, value in mapping or ():
    File "/home/ubuntu/.virtualenvs/eco_app/lib/python2.7/site-packages/werkzeug/formparser.py", 
        line 518, in <genexpr>
    form = (p[1] for p in formstream if p[0] == 'form')
    File "/home/ubuntu/.virtualenvs/eco_app/lib/python2.7/site-packages/werkzeug/formparser.py", 
        line 494, in parse_parts
        _write(ell)
IOError: [Errno 28] No space left on device

现在,服务器有足够的可用空间-超过3Gb。

我查看了Werkzeug github repo以试图找到Werkzeug试图写入的位置,但无法跟踪。

我还检查了tempfile.gettempdir(),它将/var/tmp作为临时文件目录,但是这个文件夹实际上是空的,所以我认为这不是造成问题的位置。

如何找到没有空间的设备?


Tags: inpyselfformapphomeubuntulib
3条回答

Werkzeug使用tempfile.TemporaryFile()在temp目录中存储超过一定大小的文件,但要考虑到这些文件为安全起见是未链接的。你不会在目录中看到它们。tempfile.gettempdir()是确定用于此操作的目录的正确方法。

您的/var/tmp目录可能配置为较小的分区。用df -h检查这个分区是否还有足够的空间。您还需要使用df -i检查免费的索引节点

也可能是一个进程(可能是你的)挂在这些未链接的文件上的时间太长,空间还没有返回给操作系统。您可以使用以下命令检查保留已删除文件的进程:

lsof -nP | grep '/var/tmp' | grep '(deleted)'

或者

find /proc/*/fd -ls | grep '/var/tmp' | grep  '(deleted)'

如果可以在服务器上获得shell,请尝试键入df -h,并查找显示Use%为100%或Avail小于文件大小的任何条目。

@汤姆亨特的评论是正确的。

这个unix SE答案解释了what happened

As a protection against low disc space, some daemons automatically "shadows" the current /tmp/ dir with a ram disc if the the root partition runs out of disc space. Sadly there's no automatic reversion of that process once enough disc space is free again.

我卸载了/tmp目录并遵循了Nitesh的建议:

sudo umount /tmp
sudo echo 'MINTMPKB=0' > sudo /etc/default/mountoverflowtmp

现在上传工作正常。

相关问题 更多 >

    热门问题