ローカルファイルをリモートディレクトリにコピーし、コピーしたばかりのスクリプトを参照する新しい行でリモートファイルを更新するスクリプトがあります。
場合によっては、リモートディレクトリ内の特定のファイルを削除する必要があり、そのファイルを参照するファイルを更新してそのエントリを削除する必要があります。
問題:スクリプトは、複数のインスタンスでリモートサーバー上の複数のディレクトリに対して実行できます。つまり、インスタンスに渡されたタイプに基づいてコピーするファイルを格納するリモートサーバーのディレクトリが少なくとも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
flock
Linuxを実行していて(の一部)がある場合は、ロックを使用する必要があります。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
、南京錠の下に進みます。mv
echo
同時プロセスは並列に実行できますが、scp
ログ操作はシリアライズされます。
あなたが持っていない場合はflock
、セマフォ/ロックとして使用できるUnixコマンドは何ですか?いくつかの選択肢があります(このmkdir
方法はどこでも機能します)。