そのディレクトリのメタデータを含むディレクトリとファイルの内容を安全に更新します。

そのディレクトリのメタデータを含むディレクトリとファイルの内容を安全に更新します。

ローカルファイルをリモートディレクトリにコピーし、コピーしたばかりのスクリプトを参照する新しい行でリモートファイルを更新するスクリプトがあります。
場合によっては、リモートディレクトリ内の特定のファイルを削除する必要があり、そのファイルを参照するファイルを更新してそのエントリを削除する必要があります。
問題:スクリプトは、複数のインスタンスでリモートサーバー上の複数のディレクトリに対して実行できます。つまり、インスタンスに渡されたタイプに基づいてコピーするファイルを格納するリモートサーバーのディレクトリが少なくとも2つあります。ファイルのコピーと「ログ」アップデートをややアトミックにする方法は?
同時インスタンスをたくさん実行していないため、深刻な問題ですが、ファイルが正しく更新されるようにこのように変更する方法があるかどうか疑問に思います。
たとえば、次のように動作しますか?

scp file.bin remoteserver:/foo/$type/  
grep -v "oldfile.bin" entries.log > entries.log.backup && mv entries.log.backup entries.log  
echo "$record" >> entries.log  

ベストアンサー1

flockLinuxを実行していて(の一部)がある場合は、ロックを使用する必要があります。util-linux簡単です。

scp file.bin remoteserver:/foo/$type/
(
  flock 9
  grep -v "oldfile.bin" entries.log > entries.log.backup && mv entries.log.backup entries.log  
  echo "$record" >> entries.log
) 9>entries.log.lock

これにより、ファイルがコピーされロックが取得されるのを待ってからログのみが更新されます。ログに追加したいとします。

ここでのアイデアはこれをentries.log.lockロックファイルとして使用することです(ログファイル自体を置き換える予定なので使用できません)。9>entries.log.lock必要に応じてファイルが生成され、ファイル記述子9がそれに接続され、角かっこの間のコマンドがサブシェルで実行されます。flock 9ファイル記述子9が指すファイルのロックを取得し、必要に応じてファイル記述子が閉じるのを待ちます。これはサブシェルがシャットダウンしたときに発生します。その後grep、南京錠の下に進みます。mvecho

同時プロセスは並列に実行できますが、scpログ操作はシリアライズされます。

あなたが持っていない場合はflockセマフォ/ロックとして使用できるUnixコマンドは何ですか?いくつかの選択肢があります(このmkdir方法はどこでも機能します)。

おすすめ記事