5

質問:

inotify[Linux]システムでファイルを確実に記録するために使用できますか?

詳細:

ユーザーの動きを追跡するために使用しようとしてinotifywaitいます(現在はbashを使用しています、スクリプト言語に移行することをお勧めします)。最終的には、作成時にデータベースに新しいファイルを追加し(createmoved_from)、ファイルの変更時にデータベース内の既存の行を更新し(、、modifyattribmove_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

2つの新しいファイルが作成済み(4913および.goutputstream-HN3ZDW)として表示されるだけでtest3.txt~なく コマンドでチェックするとtest3.txtファイルが作成されたとしても、作成中のファイルはであり、ではないことに注意してください。完全を期すために、上記の例を示しますが、さらにいくつかのオプションがあります。test3.txtls

例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データベース内のファイルを更新するために使用することは可能ですか?」です。たとえば、ユーザーがファイルを編集して保存した場合、まったく別のファイルを置き換える新しいファイルではなく、そのファイルの更新としてデータベースに反映されるようにします。たとえそれが私を別の方向に向ける提案であったとしても、どんな助けでも大いに感謝されるでしょう。

4

1 に答える 1

3

inotifyそれが起こるように何が起こるかを教えてくれます。

Geditは、ほとんどのエディターと同様に、最初に一時ファイルを書き込んでから、そのファイルを所定の位置に移動することで保存します。これにより、ファイルの書き込み中にエディターまたはシステム全体がクラッシュした場合に、ファイルが半分書き込まれたバージョンで上書きされるのを防ぐことができます。Vimは別のアプローチを取ります(これは構成可能です。ここでは詳しく説明しません。たとえば、「vi」エディターで編集するとinode値が変わる理由を参照してください)。最初に一時バックアップファイルを作成し、次に新しいファイルを書き込みます。 。

これらを単一の編集イベントとして記録する場合は、偶数ログでパターン認識を実行する必要があります。既存のファイルを置き換えるcreate-write-moveシーケンスと、vimのようなcreate-move-createdeleteシーケンスが典型的なパターンになります。パターンは他のイベントとインターリーブされる可能性があることに注意してください。

私はあなたがやりたいことをするためのより良い方法があるのではないかと疑っていますが、あなたが何をしようとしているのか理解できません。ユーザーアクションをログに記録しようとしている場合は、すでに方法を見つけていますが、より簡単な方法があります。loggedfsまたは監査サブシステムです。すべてのファイルバージョンのバックアップを保持する場合は、エディターをバージョン管理システムに接続するか(これにより、ユーザーがバックアップ対象を制御できるようになります) 、 copyfsなどのバージョン管理ファイルシステムを使用します。mysqlfspostgresqlfsなどのファイルシステムを使用して、ファイルをデータベースに直接保存することもできます(確かにどちらのプロジェクトも維持されているようには見えません)。

于 2012-05-11T02:05:29.170 に答える