複数のインスタンスで実行されるシェルスクリプトがあります。あるインスタンスがファイルにアクセスして操作を実行している場合、別のインスタンスが同じファイルにアクセスしてデータが破損しないようにするにはどうすればよいですか。
私の質問は、並列実行制御に関するものではなく、ファイルロックまたは表示メカニズムを扱うことです。
続行するためにいくつかのアドバイスを求めます。
答え1
Linuxは通常、Windowsとは異なりロックを実行しません。これには多くの利点がありますが、ファイルをロックする必要がある場合はいくつかのオプションがあります。私はお勧めします
グループ:開いているファイルにアドバイザリロックを適用または削除する。
このユーティリティは、シェルスクリプト内またはコマンドラインでクラスタ(2)ロックを管理します。
単一のコマンド(またはフルスクリプト)の場合は、次のものを使用できます。
flock --exclusive /var/lock/mylockfile -c command
ロック状態でスクリプトでより多くのコマンドを実行するには、次のようにします。
#!/bin/bash
....
(
flock --nonblock 200 || exit 1
# ... commands executed under lock ...
) 200>/var/lock/mylockfile
flock
サブシェル内の呼び出し以降のすべての操作は、現在保持している他のプロセスがない場合にのみ実行されます。サブシェルが終了すると、ロックは自動的に解放されます。(...)
flock
/var/lock/mylockfile
flock
ファイルロックが削除されるのを待つこともできます(デフォルト)。この場合、この--nonblock
オプションを使用しないでください。flock
ロックを正常に獲得できないと失敗します。