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

题:

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

细节:

我正在尝试使用inotifywait来跟踪用户的移动(目前正在使用bash,但是我已经将suggested迁移到脚本语言).最终,我想在创建(create,moved_from)时向数据库添加新文件,在文件修改(modify,attrib,move_to)时更新数据库中的现有行,最后在删除文件时删除一行(删除).然而,我遇到了许多问题,因为即使是像保存一样看似简单的动作,也会产生许多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

请注意,不仅两个新文件显示为ben(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来更新数据库中的文件”?例如,如果用户编辑并保存文件,我希望它作为该文件的更新反映在数据库中,而不是替换完全不同的文件的全新文件.任何帮助将不胜感激,即使这是一个指向我不同方向的建议.

最佳答案 inotify告诉你发生了什么.

与大多数编辑一样,Gedit通过首先编写临时文件然后将该文件移动到位来进行保存.这样可以避免在编写文件时使用半写版本覆盖文件,以防编辑器或整个系统崩溃. Vim采用了不同的方法(这可以配置,我不会在这里详细介绍 – 参见例如why inode value changes when we edit in “vi” editor?):它首先创建一个临时备份文件,然后写入新文件.

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

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

点赞