Вопрос:
Можно ли использовать inotify
для надежной записи файлов в системе [linux]?
Подробности:
Я пытаюсь использовать inotifywait
для отслеживания перемещений пользователей (в настоящее время используется bash, но это было предложено что я перехожу на язык сценариев). В конечном итоге я хочу добавить новые файлы в базу данных при создании (create
, moved_from
), обновить существующие строки в базе данных при изменении файла (modify
, attrib
, move_to
) и, наконец, удалить строку при удалении файла (delete
). Однако я сталкиваюсь со многими проблемами, так как даже такое, казалось бы, простое действие, как сохранить, генерирует много сообщений inotifywait. Обратите внимание на следующие команды и их вывод (обратите внимание, /home/user/
используется исключительно в качестве примера):
Примеры:
Пример 1. Прослушивание создания файла:
$ inotifywait -mr /home/user/ -e create --format %w:%f:%e:%T --timefmt %T
Нажмите:
$touch test.txt
/home/user/:test.txt:CREATE:21:35:30
Откройте новый файл с помощью vim, затем введите команду :w:
$vim test2.txt
/home/user/:test2.txt:CREATE:21:35:30
Откройте существующий файл с помощью vim, затем введите команду :w:
$vim test2.txt
/home/user/:4913:CREATE:21:35:30
/home/user/:test2.txt:CREATE:21:35:30
Откройте новый файл с помощью gedit и нажмите "Сохранить":
$gedit test3.txt
/home/user/:test3.txt~:CREATE:21:35:30
Откройте существующий файл с помощью gedit и нажмите "Сохранить":
$gedit test3.txt
/home/user/:.goutputstream-HN3ZDW:CREATE:21:35:30
/home/user/:test3.txt~:CREATE:21:35:30
Обратите внимание, что не только два новых файла отображаются как созданные (4913
и .goutputstream-HN3ZDW
), но и единственный создаваемый файл — test3.txt~
, а не test3.txt
, хотя файл test3.txt
создается при проверке с помощью команда ls
. Для полноты приведем приведенный выше пример, но с несколькими дополнительными параметрами.
Пример 1. Прослушивание создания, изменения, удаления и перемещения файла:
$ inotifywait -mr /home/user/ -e create -e modify -e delete -e moved_to -e moved_from --format %w:%f:%e:%T --timefmt %T
Нажмите:
$touch test.txt
/home/user/:test.txt:CREATE:21:35:30
Откройте новый файл с помощью vim, затем введите команду :w:
$vim test2.txt
/home/user/:test2.txt:CREATE:22:12:32
Откройте существующий файл с помощью vim, затем введите команду :w:
$vim test2.txt
/home/user/:4913:CREATE:22:04:35
/home/user/:4913:DELETE:22:04:35
/home/user/:test2.txt:MOVED_FROM:22:04:35
/home/user/:test2.txt~:MOVED_TO:22:04:35
/home/user/:test2.txt:CREATE:22:04:35
/home/user/:test2.txt~:DELETE:22:04:35
Откройте новый файл с помощью gedit и нажмите "Сохранить":
$gedit test3.txt
/home/user/:test3.txt~:CREATE:21:35:30
Откройте существующий файл с помощью gedit и нажмите "Сохранить":
$gedit test3.txt
/home/user/:.goutputstream-0WQ2DW:CREATE:22:06:34
/home/user/:test3.txt~:CREATE:22:06:34
/home/user/:.goutputstream-0WQ2DW:MOVED_FROM:22:06:34
/home/user/:test3.txt:MOVED_TO:22:06:34
В основном мой вопрос: «Можно ли использовать inotify
для обновления файла в базе данных»? Например, если пользователь редактирует файл и сохраняет его, я хочу, чтобы он отражался в базе данных как обновление этого файла, а не новый файл, заменяющий совершенно другой файл. Любая помощь будет принята с благодарностью, даже если это предложение, указывающее мне в другом направлении.