我正在将一个小文件(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作为临时文件目录,但是这个文件夹实际上是空的,所以我认为这不是创建问题的位置。
如何找到没有空间的设备?
答案 0 :(得分:14)
此unix SE答案解释what happened。
作为防止低磁盘空间的保护,一些守护进程自动&#34;阴影&#34;如果根分区用尽磁盘空间,则使用ram光盘的当前/ tmp / dir。遗憾的是,一旦足够的磁盘空间再次释放,就不会自动恢复该过程。
我已卸载/ tmp目录并遵循Nitesh的建议:
sudo umount /tmp
sudo echo 'MINTMPKB=0' > sudo /etc/default/mountoverflowtmp
现在上传工作正常。
答案 1 :(得分:6)
如果您可以在服务器上获取shell,请尝试键入df -h
并查找显示Use%
100%或Avail
小于文件大小的任何条目。< / p>
答案 2 :(得分:6)
Werkzeug使用tempfile.TemporaryFile()
在临时目录中存储特定大小的文件,但考虑到这些文件取消链接以确保安全性。您不会在目录中看到它们。 tempfile.gettempdir()
是确定用于此目录的正确方法。
您的/var/tmp
目录可能是针对较小的分区配置的。检查df -h
以查看该分区是否仍有足够的空间。您还需要使用df -i
检查免费的 inode 。
也可能是一个进程(可能是你的)暂停了这些未链接的文件太长,而且还没有将空间返回给操作系统。您可以使用以下命令检查保留已删除文件的进程:
lsof -nP | grep '/var/tmp' | grep '(deleted)'
或
find /proc/*/fd -ls | grep '/var/tmp' | grep '(deleted)'
答案 3 :(得分:4)
尝试df -i
,也许没有免费的inode。
编辑:
另一种选择,找到werkzeug pid,让它成为777,
strace -p 777 &> /tmp/strace_log
No space left on device
消息,它就像
写write(1, "blah blah ..."..., 57) = -1 ENOSPC (No space left on device)
的第一个参数是文件描述符open(... = X
系统调用,X是一个文件描述符,在“写入”系统调用步骤中将失败我知道,这非常麻烦,但那是在调试。