我遇到一个奇怪的问题,似乎是由 VIM、Linux VFS 缓存、ecryptfs 和/或某些与文件系统相关的东西引起的:
- 我在 VIM 中打开一个文件,修改它并保存它。
- 我尝试访问该文件。
预期行为
一旦:w
报告文件已写入,该文件就应该可以访问。
实际行为
该文件不存在。
如果我稍等一下(通常不到一秒),文件就会出现。
当使用 Python 代码和遗留pyc
文件时,这尤其麻烦。由于新py
文件尚未准备好,我经常最终启动旧代码。我最近添加了export PYTHONDONTWRITEBYTECODE=1
我的代码.bashrc
,因此我收到了一条有意义的错误消息,而不是执行旧代码。这仍然很尴尬,因为任何自动重新加载代码(例如来自 Django)每隔 5-10 次就无法重新加载,因为我更改的文件会在短时间内丢失。文件pyc
就位后,自动重新加载器有时最终会加载旧pyc
文件,之后再也不会发现该py
文件已被修改并触发另一次重新加载。
系统详细信息和配置
我的机器有足够的 RAM (32 GiB)、一个 SSD,并且基本上处于闲置状态。因此我不认为缓慢的 I/O 会导致这种情况。该文件非常小(<1 KiB),空文件也会发生这种情况。我正在使用$HOME
ecryptfs 进行加密,因此这可能是问题的一部分。我无法在/tmp
使用tmpfs
文件系统的安装上重现此问题。
VIM 设置
文件被移走并被新文件替换的原因是我的VIM设置引起的:
set backup
set backupskip=
set backupdir=$HOME/.vimbackup
set writebackup
我希望new
在 VIM 报告文件已写入后立即可以访问该文件。我检查了 VIM 文档是否有任何延迟写入的提示,但没有找到任何内容。我无法使用 shell 命令重现这一点mv
,cp
所以rm
我认为 VIM 正在做一些不同的事情。
还有什么可能导致这种情况?我该如何解决这个问题。
答案1
这是一个错误,但与亚伦链接的错误无关。我目前无法重现它,所以您可以在这里提交一个新的错误吗:https://bugs.launchpad.net/ecryptfs/+filebug
您可以复制并粘贴上面的描述,但我还需要了解有关您正在使用的 Linux 发行版和内核版本的更多信息。谢谢!
答案2
答案3
我认为您看到的行为只是因为 Vim 备份过程很慢。在我的普通 Ext4 系统上,此问题表现为编译器出现“文件为空”错误。
为了检查时间,我使用了这个 Bash 序列:
strace -tt -o /dev/stdout gvim --nofork main.cxx | grep 'main.cxx\|close'
打开备份后,我发现文件消失和最终保存之间有 200 毫秒的间隙:
09:06:49.587341 rename("main.cxx", "main.cxx~") = 0
09:06:49.668654 open("main.cxx", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 12
09:06:49.755454 close(12) = 0
set nowritebackup
当我在 my 中使用时.vimrc
,该文件不会被重命名;只有打开和关闭:
09:19:45.731416 open("main.cxx", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 12
09:19:45.815763 close(12) = 0
这是对您遇到的问题的一个很好的解释吗?
PS我在网上找不到任何其他提到这个问题的地方Vim 问题跟踪器,或者在 Vim 上开发商/用户邮件列表,所以我不能说 Vim 团队是否会考虑更改备份系统调用序列。