この質問は、私がStackoverflowで提起した別の質問から生じます。私が使用していウォッチャーを -同じ問題がに適用されますIncron -離れて変わり、静かにリスのためのDropboxにそれらの変更をフォルダとその子フォルダを監視すること。
write_close
イベントを監視します-- IN_CLOSE_WRITE
目的のため。もともと私はmodify
イベント、すなわちIN_MODIFYを見ていました。これは機能しましたが、大きなファイルを書き込むと、複数回起動することがわかりました。それは公平に聞こえたのでIN_CLOSE_WRITE
、特定のファイルについては一度しか発生しないと仮定するのが合理的だと感じたため、切り替えました。
ただし、そうではありません。Nanoで作成された非常に小さなテキストファイル(1文字のみ)でも、イベントは2回発生します。せいぜいこれは、同じファイルがDropboxで2回同期されると、不必要なトラフィックになる可能性があります。私の場合、最初のイベントで同期を実行してからサーバー側のファイルを削除するため、災害につながります。結果-2番目のイベントでは、Dropbox側のファイルは0バイトのファイルになります。
私は今のところ、他の作業を行う前に同期スクリプトを10秒間スリープさせ、Dropboxの同期を試みる前に問題のファイルがまだ存在することを確認することで対処しています。これが機能するのは、2回目の反復でファイルが見つからず、スクリプトが終了するだけだからです。
これはせいぜいハックに聞こえます。恐らく悪いハックではないかもしれませんが、私は理解したいと思います-なぜIN_CLOSE_WRITE
イベントが複数回発生するのですか?
いくつかの追加情報
- ウォッチャーのインスタンスが複数実行されていないことを確認してください。
からの出力 ps ax|grep watcher.py
23880 ? Sl 0:01 python /usr/local/bin/watcher.py restart
24977 pts/0 S+ 0:00 grep --color=auto watcher.py
ファイルシステムはext4
です。Incronでまったく同じ問題が発生したことに言及する必要があります。経由で実行されるバッチスクリプトからWatcherデーモンを起動します/etc/rc2.d
。Incron OTHは、デフォルトのapt-get install incron
インストールを介して、私が何もしなくても起動します。
私のwatcher.ini
ファイルの本質を以下に示します。
[DEFAULT]
logfile=/var/log/watcher.log
pidfile=/var/run/watcher.pid
[job1]
watch=/path/to/watch
events=write_close
excluded=
recursive=true
autoadd=true
command=/home/datastore.php $filename
datastore.php
面倒なDropboxアップロード+ソース削除コードなしでスクリプトが2回起動されることを確認するために、スクリプトを必要最低限のものに減らしました。
#! /usr/bin/php
<?php
file_put_contents('/tmp/watcher',$argv[1],FILE_APPEND);
?>
次に、問題のパスに小さなファイルを作成して調べました/tmp/watcher
。問題は解決しません$argv[1]
。ファイルには、まだ2つの連続したエントリがあります。
ext4
あり、Watcherの2つのインスタンスが実行されていないことを合理的に確信しています。Incronでも同じ問題に遭遇しました。
delete
ルーチンを無効にして再試行できますか?
unlink
問題が持続をする