1

bash (またはその他のもの) スクリプトの並列実行を防ぐ通常の方法は、開始時にロック ディレクトリを作成し、終了時に削除し、開始時にチェックすることです。ただし、スクリプトが強制終了または異常終了し、ロックが永続的になる場合があります。

これを解決するためのアプローチは、しきい値を設定することです。ロックは古いと見なされ、作成されてから時間が経ちすぎている場合は無視する必要があります。ただし、繰り返しますが、私の bash スクリプトは他のプログラムを呼び出し、長時間にわたって実行される可能性があり (また、複数の小さな作業に分割することはほとんどできません)、このアプローチを利用できなくしています...

この問題を解決する方法はありますか? または、スクリプトを並列実行からロックする別の方法はありますか?

4

2 に答える 2

2

ロック ディレクトリに加えて、ロックを保持しているインスタンスのプロセス ID を保存することもできます。別のインスタンスがブロックされていることがわかった場合、そのプロセス ID をチェックして、まだ実行されているかどうかを確認できます。実行されていない場合は、ロック ディレクトリと PID レコードを削除してから、ロックの再取得を試みます。

編集者注: ファイルシステムの基礎となるシリアライゼーション プロパティを使用して高レベルの同期を実装することは、一般的なアプローチです。簡単なソリューションや、シェル スクリプトですべてを実行する必要がある場合に最適です。それよりも強力なものが必要な場合は、TCP/IP が壊れにくく、より移植性の高いアプローチを提供する可能性があります。C (またはほとんどすべての他の言語) で軽量の TCP/IP サーバーを作成できます。アプリケーションの起動要求をポートでリッスンするだけです (シングルスレッド、一度に 1 つの接続、TCP レイヤーがすべての競合状態を解決できるようにする)。進行中のジョブを監視しながら、いつ新しいリクエストを受け入れるかを確認します。

于 2013-10-19T02:31:17.483 に答える
0

私が最初に考えたのは、プロセスの終了時に自動的に解放される flock() などの Linux 呼び出しを使用するのに十分なだけの C を作成することでした。これについての私の記憶をリフレッシュしようとして、http://linux.die.net/man/1/flockで「flock - シェル スクリプトからのロックの管理」に関する情報を見つけました。そうでない場合は、そのようなものを実装するのはかなり簡単かもしれません。

于 2013-10-19T04:07:46.233 に答える