vimでinotifywaitを使用する

vimでinotifywaitを使用する

ファイルの変更を監視し、それをリモートレプリケーションと同期させる簡単なスクリプトがあります。

#!/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

おすすめ記事