可以inotify
用于可靠地记录[linux]系统中的文件吗?
我正在尝试使用inotifywait
来跟踪用户的移动(目前正在使用bash,但我已迁移到脚本语言suggested)。最后,我希望在创建时将新文件添加到数据库(create
,moved_from
),在文件修改后更新数据库中的现有行(modify
,attrib
,{{ 1}}),最后在删除文件时删除一行(move_to
)。然而,我遇到了许多问题,因为即使是像 save 这样看似简单的动作,也会产生许多inotifywait消息。观察以下命令及其输出(注意,使用delete
纯粹是出于示例目的):
示例1:侦听文件创建:
/home/user/
:触摸
$ inotifywait -mr /home/user/ -e create --format %w:%f:%e:%T --timefmt %T
使用vim打开一个新文件,然后发出:w命令:
$touch test.txt
/home/user/:test.txt:CREATE:21:35:30
使用vim打开现有文件,然后发出:w命令:
$vim test2.txt
/home/user/:test2.txt:CREATE:21:35:30
使用gedit打开新文件,然后点击保存:
$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 test3.txt
/home/user/:.goutputstream-HN3ZDW:CREATE:21:35:30
/home/user/:test3.txt~:CREATE:21:35:30
和4913
),而且创建的唯一文件是.goutputstream-HN3ZDW
和不< / strong> test3.txt~
,即使使用test3.txt
命令检查时创建了文件test3.txt
。为了完整起见,这是上面的示例,但还有一些选项。
示例1:侦听文件创建,修改,删除和移动:
ls
:触摸
$ inotifywait -mr /home/user/ -e create -e modify -e delete -e moved_to -e moved_from --format %w:%f:%e:%T --timefmt %T
使用vim打开一个新文件,然后发出:w命令:
$touch test.txt
/home/user/:test.txt:CREATE:21:35:30
使用vim打开现有文件,然后发出:w命令:
$vim test2.txt
/home/user/:test2.txt:CREATE:22:12:32
使用gedit打开新文件,然后点击保存:
$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 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
更新数据库中的文件”?例如,如果用户编辑并保存文件,我希望它作为该文件的更新反映在数据库中,而不是替换完全不同的文件的全新文件。任何帮助都会受到高度赞赏,即使这是一个指向我不同方向的建议。
答案 0 :(得分:2)
inotify
告诉你发生了什么。
如果您希望将这些记录为单个编辑事件,则必须在偶数日志上执行某些模式识别。替换现有文件的创建 - 写 - 移动序列和像vim一样的创建 - 移动 - 创建删除序列将是原型模式。请注意,该模式可能与其他事件交错。
我怀疑有更好的方法来做你想做的事,但我不明白你想做什么。如果您正在尝试记录用户操作,那么您已经找到了一种方法,但有更简单的方法:loggedfs or the audit subsystem。如果要保留所有文件版本的备份,请将编辑器连接到版本控制系统(这样可以让用户控制备份的内容)或使用versioning filesystem等copyfs。您甚至可以使用mysqlfs或postgresqlfs这样的文件系统直接将文件存储在数据库中(诚然,这两个项目看起来都没有维护)。