2

質問の焦点を完全に絞ることができず、申し訳ありません。

ここで受け入れられた回答で説明されているように、スクリプトを同時に実行しないように flock を使用しようとしています: スクリプトが同時に実行されるのを防ぐ方法は?

この方法では、スクリプトをまったく実行できないなどの問題が発生する可能性があると誰かが言ったのを覚えています。

誰かがそのような可能性について知っていますか?

次のシナリオを試しました。

  1. スクリプトを実行した直後に実行します - 2 回目は完全に実行されました
  2. CTRL+でスクリプトを中断してCから、もう一度実行します - 2 回目の実行では問題ありません
  3. スクリプトの実行中にマシンを突然シャットダウンし、マシンの電源を入れてスクリプトを再実行します - 同じ結果: 問題ありません

もっと複雑な可能性について考えることができませんでした。

4

1 に答える 1

3

その名前が示すように、flockユーティリティはシステム コールをラップします。このflock(2)システム コールのドキュメントには、ロックを開いているファイルのテーブル内の fd のエントリに関連付けると記載されています。開いているファイルは、最後のファイル記述子が閉じられると削除されます。記述子自体は一時的なリソースであり、kill -9. マシンを強制的にシャットダウンすると、実行中のシステムの状態全体が消去されるため、開いているファイルに関連付けられているロックもそのシナリオに耐えることができません。したがって、タイムリーに終了するスクリプトがシステムをブロックすることはありません。

頭に浮かぶブロックの現実的な可能性の 1 つは、スクリプトにバグがあり、スクリプトが無期限にハングすることです。これにより、実際に他のインスタンスを実行できなくなります。これが実際に発生することが予想される場合は$$、ロックを取得した直後にスクリプト PID ( ) をロック ファイルに書き出すことで対処できます。ロックが取得される前に、ロックを待機するプロセスは、-wオプション toを使用してタイムアウトを指定しますflock。タイムアウトになると、ハングしているロック所有者の PID をロック ファイルから読み取り、所有者を強制終了して、ロック プロセスを繰り返します。

理論上の問題は、ハードコードされたファイル記述子番号 200 です。スクリプトが 200 個のファイルを開く場合、または close-on-exec ビットなしで 200 個のファイルを開くプログラムから生成された場合、既存のファイル記述子を破壊します。これが実際に発生する可能性は非常に低いです。

于 2012-12-09T14:04:03.927 に答える