问题:
可以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
触碰:
$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
用来更新数据库中的文件”?例如,如果用户编辑一个文件并保存它,我希望它作为对该文件的更新反映在数据库中,而不是一个全新的文件替换一个完全不同的文件。任何帮助将不胜感激,即使这是一个将我指向不同方向的建议。