【发布时间】:2012-05-10 05:21:41
【问题描述】:
问题:
inotify 可以用来在 [linux] 系统中可靠地记录文件吗?
详情:
我正在尝试使用 inotifywait 来跟踪用户的动作(目前使用 bash,但我已将 suggested 迁移到脚本语言)。最终我想在创建时向数据库添加新文件(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~ 和 not test3.txt ,即使在使用ls 命令检查时创建了文件test3.txt。为了完整起见,这里是上面的示例,但还有更多选项。
示例 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 更新数据库中的文件”?例如,如果用户编辑一个文件并保存它,我希望它作为对该文件的更新反映在数据库中,而不是一个全新的文件替换一个完全不同的文件。任何帮助都将不胜感激,即使这是一个将我指向不同方向的建议。
【问题讨论】: