Intereting Posts
Расписание работы с нерегулярными интервалами Почему pvremove имеет двойную «силу» на странице руководства? Как растеризовать весь текст в PDF? Как включить ярлыки для программы установки gnome и приложений для винных приложений в dmenu? Обнаружение общих строк в двух файлах с использованием 4 полей с использованием awk и UNIX KTorrent: перемещение данных в сценарии оболочки gnome-settings-daemon считает, что подключено несколько мониторов Разрешения чтения / записи для демона, выполняемого как не root fstab автомонтированное устройство не автоматически размонтируется Преобразование папки изображений в многостраничный файл pdf с помощью инструментов командной строки? Нужно ли настраивать ZFS (используя FreeBSD 10) для файлов на иностранном языке (например, имена файлов на японском / тайском языке / etc)? emacs, Как скопировать регион и оставить его выделенным? Конфигурация – apache2.conf на Debian Убивание процесса cron и предотвращение его перезапуска Является ли CentOS точно такой же, как RHEL?

Файл пропадает в течение короткого периода времени после сохранения его с помощью VIM

У меня возникла странная проблема: швы должны быть вызваны VIM, кеш Linux VFS, ecryptfs и / или что-то связанное с файловой системой:

  1. Я открываю файл в VIM, изменяю его и сохраняю.
  2. Я пытаюсь получить доступ к файлу.

Ожидаемое поведение

Файл должен быть доступен, как только :w сообщает файл как написанный.

Фактическое поведение

Файл не существует.

Если я немного подожду (обычно меньше секунды), файл появится.

Это особенно громоздко при работе с кодом Python и оставленными файлами pyc . Я часто заканчивал запуск старого кода, так как новый файл py не был готов. Недавно я добавил export PYTHONDONTWRITEBYTECODE=1 в мой .bashrc чтобы получить export PYTHONDONTWRITEBYTECODE=1 сообщение об ошибке, а не выполнять старый код. Это по-прежнему очень неудобно, поскольку любой код автоматического перезагрузки (например, из Django) не перезагружается каждые 5-10 раз, потому что файл, который я изменил, пропадает в течение короткого периода времени. С файлами pyc на месте автоматический перезарядчик иногда заканчивал загрузкой старого файла pyc и после этого не обнаружил, что файл py был изменен и вызван другой перезагрузкой.

Детали и конфигурация системы

Моя машина имеет много оперативной памяти (32 гигабайта), SSD и в основном бездействует. Поэтому я не думаю, что причиной этого является медленный ввод-вывод. Файл очень маленький (<1 KiB), и это также происходит для пустых файлов. Я использую зашифрованный $HOME с использованием ecryptfs, поэтому это может быть частью проблемы. Я не смог воспроизвести это на моем /tmp mount, который использует файловую систему tmpfs .

Настройки VIM

Причина, по которой файл удаляется и заменяется новым файлом, вызван настройками VIM:

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

Я ожидаю, что new файл будет доступен сразу после того, как VIM сообщит, что файл написан. Я проверил документацию VIM о любых намеках на задержку записи, но ничего не нашел. Я не смог воспроизвести это с помощью команд оболочки mv , cp и rm поэтому я думаю, что VIM делает что-то другое.


Что еще может быть причиной этого? Как я могу это решить.

Это ошибка, но она не связана с тем, с которым связан Аарон. Я не могу воспроизвести его на данный момент, так что, пожалуйста, напишите здесь новую ошибку: https://bugs.launchpad.net/ecryptfs/+filebug

Вы можете скопировать и вставить из описания выше, но мне также нужно узнать больше о дистрибутиве Linux и версии ядра, которые вы используете. Благодаря!

Вероятно, это дефект ошибки / по умолчанию в ecryptfs. См. Отчет об ошибке пусковой панели .

В двух словах, ecryptfs просто не записывает файл на диск немедленно. Я предполагаю, что это из-за служебных данных шифрования (файловая система, вероятно, шифрует данные в фоновом потоке и записывает их только после завершения).

Ошибка с 2009 года, а приоритетом является «Список пожеланий» (ниже «Низкий»). Я немного волнуюсь, как « предприятие » и такое поведение смешиваются; как вы выяснили, много кода ожидает, что файлы будут доступны сразу после их сохранения.

Вместо этого попробуйте использовать TrueCrypt .

Я думаю, что поведение, которое вы видите, просто потому, что процесс резервного копирования Vim медленный. В моей простой системе Ext4 эта проблема проявляется как ошибка «file is empty» из компилятора.

Чтобы проверить тайминги, я использовал эту последовательность 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 в моем .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 issue или в списках рассылки разработчиков / пользователей Vim, поэтому я не могу сказать, будет ли команда Vim рассматривать возможность изменения последовательности вызовов системы резервного копирования.