使用VIM保存文件后短时间内丢失

使用VIM保存文件后短时间内丢失

我遇到一个奇怪的问题,似乎是由 VIM、Linux VFS 缓存、ecryptfs 和/或某些与文件系统相关的东西引起的:

  1. 我在 VIM 中打开一个文件,修改它并保存它。
  2. 我尝试访问该文件。

预期行为

一旦:w报告文件已写入,该文件就应该可以访问。

实际行为

该文件不存在。

如果我稍等一下(通常不到一秒),文件就会出现。

当使用 Python 代码和遗留pyc文件时,这尤其麻烦。由于新py文件尚未准备好,我经常最终启动旧代码。我最近添加了export PYTHONDONTWRITEBYTECODE=1我的代码.bashrc,因此我收到了一条有意义的错误消息,而不是执行旧代码。这仍然很尴尬,因为任何自动重新加载代码(例如来自 Django)每隔 5-10 次就无法重新加载,因为我更改的文件会在短时间内丢失。文件pyc就位后,自动重新加载器有时最终会加载旧pyc文件,之后再也不会发现该py文件已被修改并触发另一次重新加载。

系统详细信息和配置

我的机器有足够的 RAM (32 GiB)、一个 SSD,并且基本上处于闲置状态。因此我不认为缓慢的 I/O 会导致这种情况。该文件非常小(<1 KiB),空文件也会发生这种情况。我正在使用$HOMEecryptfs 进行加密,因此这可能是问题的一部分。我无法在/tmp使用tmpfs文件系统的安装上重现此问题。

VIM 设置

文件被移走并被新文件替换的原因是我的VIM设置引起的:

set backup
set backupskip=
set backupdir=$HOME/.vimbackup
set writebackup

我希望new在 VIM 报告文件已写入后立即可以访问该文件。我检查了 VIM 文档是否有任何延迟写入的提示,但没有找到任何内容。我无法使用 shell 命令重现这一点mvcp所以rm我认为 VIM 正在做一些不同的事情。


还有什么可能导致这种情况?我该如何解决这个问题。

答案1

这是一个错误,但与亚伦链接的错误无关。我目前无法重现它,所以您可以在这里提交一个新的错误吗:https://bugs.launchpad.net/ecryptfs/+filebug

您可以复制并粘贴上面的描述,但我还需要了解有关您正在使用的 Linux 发行版和内核版本的更多信息。谢谢!

答案2

这可能是 ecryptfs 中的错误/设计缺陷。看到这个启动板错误报告

简而言之,ecryptfs 只是不会立即将文件写入磁盘。我猜测这是因为加密开销(文件系统可能会在后台线程中加密数据并仅在完成后才写入)。

该错误来自 2009 年,优先级为“愿望清单”(低于“低”)。我有点担心怎么办”企业”并且这种行为混合在一起;正如您所发现的,许多代码期望文件在保存后立即可用。

尝试使用真密反而。

答案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 团队是否会考虑更改备份系统调用序列。

相关内容