使用 inotify 跟踪系统中的所有文件

puk*_*puk 5 database file inotify

题:

可以inotify用来在 [linux] 系统中可靠地记录文件吗?

细节:

我正在尝试用于inotifywait跟踪用户移动(目前使用 bash,但有人建议我迁移到脚本语言)。最终,我想在创建时将新文件添加到数据库 ( create, moved_from),在文件修改时更新数据库中的现有行 ( modify, attrib, move_to),最后在文件删除时删除一行 ( delete)。然而,我遇到了许多问题,即使是像save这样看似简单的操作,也会生成许多​​ inotifywait 消息。观察以下命令及其输出(注意, 的使用/home/user/仅用于示例目的):

例子:

示例 1:监听文件创建:

$ inotifywait -mr /home/user/ -e create  --format %w:%f:%e:%T --timefmt %T
Run Code Online (Sandbox Code Playgroud)

触碰:

$touch test.txt
/home/user/:test.txt:CREATE:21:35:30
Run Code Online (Sandbox Code Playgroud)

用 vim 打开一个新文件,然后发出 :w 命令:

$vim test2.txt
/home/user/:test2.txt:CREATE:21:35:30
Run Code Online (Sandbox Code Playgroud)

使用 vim 打开现有文件,然后发出 :w 命令:

$vim test2.txt
/home/user/:4913:CREATE:21:35:30
/home/user/:test2.txt:CREATE:21:35:30
Run Code Online (Sandbox Code Playgroud)

用 gedit 打开一个新文件,然后点击保存:

$gedit test3.txt
/home/user/:test3.txt~:CREATE:21:35:30
Run Code Online (Sandbox Code Playgroud)

使用 gedit 打开现有文件,然后单击保存:

$gedit test3.txt
/home/user/:.goutputstream-HN3ZDW:CREATE:21:35:30
/home/user/:test3.txt~:CREATE:21:35:30
Run Code Online (Sandbox Code Playgroud)

注意,不仅是显示为具有本两个新的文件创建(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
Run Code Online (Sandbox Code Playgroud)

触碰:

$touch test.txt
/home/user/:test.txt:CREATE:21:35:30
Run Code Online (Sandbox Code Playgroud)

用 vim 打开一个新文件,然后发出 :w 命令:

$vim test2.txt
/home/user/:test2.txt:CREATE:22:12:32
Run Code Online (Sandbox Code Playgroud)

使用 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
Run Code Online (Sandbox Code Playgroud)

用 gedit 打开一个新文件,然后点击保存:

$gedit test3.txt
/home/user/:test3.txt~:CREATE:21:35:30
Run Code Online (Sandbox Code Playgroud)

使用 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
Run Code Online (Sandbox Code Playgroud)

基本上我的问题是“是否可以inotify用来更新数据库中的文件”?例如,如果用户编辑一个文件并保存它,我希望它作为对该文件的更新反映在数据库中,而不是一个全新的文件替换一个完全不同的文件。任何帮助将不胜感激,即使它是指向我不同方向的建议。

Gil*_*il' 3

inotify告诉你会发生什么,就像它发生一样。

\n\n

Gedit 与大多数编辑器一样,通过首先写入临时文件然后将该文件移动到位来保存。这可以避免在写入文件时编辑器或整个系统崩溃的情况下用写了一半的版本覆盖文件。Vim 采用了不同的方法(这是可以配置的,我不会在这里详细介绍 \xe2\x80\x94 参见例如为什么当我们在 \xe2\x80\x9cvi\xe2\x80\x9d 编辑器中编辑时 inode 值会发生变化? ):它首先创建一个临时备份文件,然后写入新文件。

\n\n

如果您希望将这些记录为单个编辑事件,则必须对偶数日志执行一些模式识别。替换现有文件的创建-写入-移动序列和像 vim 一样的创建-移动-创建删除序列将是原型模式。请注意,该模式可能与其他事件交织在一起。

\n\n

我怀疑有更好的方法来做你想做的事,但我不明白你想做什么。如果您尝试记录用户操作,那么您已经找到了一种方法,但还有更简单的方法:loggingfs或auditsubsystem。如果您想保留所有文件版本的备份,请将编辑器连接到版本控制系统(这使用户可以控制备份的内容)或使用版本控制文件系统,例如copyfs您甚至可以使用mysqlfspostgresqlfs等文件系统直接将文件存储在数据库中(诚然,这两个项目看起来都没有维护)。

\n