ファイルの変更を監視し、それをリモートレプリケーションと同期させる簡単なスクリプトがあります。
#!/bin/bash
while inotifywait -e close_write somefile
do
rsync somefile [email protected]:./somefile
done
nanoではうまくいきますが、vimでは失敗します。 nanoを使用すると、次のように出力されます。
somefile CLOSE_WRITE,CLOSE
別のバージョンを待つ次のループを開始します。
vim を使用すると、出力がなく、スクリプトが終了コード 0 で閉じられます。
いくつかの調査の結果、initofywaitとvimを使用してclose_writeが正しいパラメータであることがわかりましたが(最初に修正イベントを使用したい)、何らかの理由で失敗しました。
答え1
編集者は、ファイルを保存するためにいくつかの戦略に従うことができます。 2つの主な変形は、既存のファイルを上書きするか、新しいファイルを作成して所定の位置に移動することです。新しいファイルを作成してその場所に移動すると、ある時点でファイルを読み取ると、ファイルのフルバージョンが提供されます(ある時点で古いファイル、次に新しいファイル)。ファイルを上書きするとしばらく不完全になるため、他のプログラムがファイルにアクセスしたりシステムがクラッシュしたりすると問題が発生する可能性があります。
Nanoは明らかに既存のファイルを上書きします。スクリプトは、close_write
書き込みが完了し、その時点で実行された時点(イベント)を検出しますrsync
。 rsyncが最初の保存操作を完了する前にすぐに連続して2回保存すると、rsyncは不完全なバージョンのファイルを取得できます。
一方、Vimは書き込み後の移動戦略を使用します。その効果は次のとおりです。
echo 'new content' >somefile.new
mv -f somefile.new somefile
最新バージョンが所定の位置に移動されている間、古いバージョンのファイルは削除されます。この時点でinotifywait
監視するファイルが存在しなくなったため、コマンドが返されます。 (新しいファイルはsomefile
同じ名前の別のファイルです。)Vimがバックアップファイルを作成するように設定されている場合、同様の状況が発生します。
echo 'new content' >somefile.new
ln somefile somefile.old
mv -f somefile.new somefile
今inotifywait
バックアップを見ています。
ファイル保存戦略の詳細については、次を参照してください。プログラムの実行中にどのようにリアルタイムアップデートを行うことができますか?そしてファイル権限と保存
Vimに上書きポリシーを使用するように指示できます。offbackupcopy
オプション( :set nobackupcopy
)。上記のように、これは危険です。
両方のストレージ戦略を処理するには、ディレクトリとフィルタとclose_write
イベントmoved_to
を監視しますsomefile
。
inotifywait -m -e close_write,moved_to --format %e/%f . |
while IFS=/ read -r events file; do
if [ "$file" = "somefile" ]; then
…
fi
done