これは珍しい問題であり、誤った設計によって発生する可能性があります。誰でも良い提案があれば聞きたいです。しかし、今は「現状のまま」解決したいと思います。
インタラクティブなスクリプトがたくさんあります。質問の目的には重要ではありません。完全性のために、これらのスクリプトはOracleデータベーススタンバイノードを物理スタンバイとスナップショットスタンバイの間で切り替え、スナップショットデータベースを作成し、レポートチームにいくつかの割り当てを追加し、古いアーカイブログを解放します。コース 。
持っている:
delete_archivelogs.sh
switch_to_physical_standby.sh
delete_archivelogs.sh
、そして最終的に呼び出されます。switch_to_snapshot_standby.sh
sync_standby.sh
、呼び出してswitch_to_physical_standby.sh
待機状態が追いつくまで待ってから呼び出します。switch_to_snapshot_standby.sh
最後のスクリプトはsync_standby.sh
通常cronジョブで実行されますが、DBAが決定した場合は各スクリプトも自由に実行できるはずです。
各スクリプトには、2回の実行を防ぐロックファイルベースの保護(クラスタリングによる)があります。ただし、これらのスクリプトには、実行中にswitch_to_snapshot_standby.sh
(個別に)起動できない共有共通ロックが必要であるため、sync_standby.sh
他のスクリプトが機能している間にDBAが誤ってスクリプトを実行しないようにする必要があります。
通常、すべてのスクリプトで同じロックファイルを構成します。この場合、sync_standby.sh
ロックが取得されると呼び出されたスクリプトは実行されないため、これは不可能です。
この場合、ロックを共有する最良の方法は何ですか?ロックコードをスキップして親スクリプト呼び出しでそれを使用するように「コマンドライン」スイッチを実装することは可能ですか?
ベストアンサー1
スクリプトのいずれもコマンドラインオプションを必要としない場合は、コマンドラインオプションを使用してこのflock
メカニズムを使用するかどうかを「スレーブ」スクリプトに表示できます。
したがって、あなたの例では、スクリプトは次の引数(たとえば)をsync_standby.sh
使用して呼び出されます。switch_to_snapshot_standby.sh
subordinate
./switch_to_snapshot_standby.sh subordinate
その後、スクリプトswitch_to_snapshot_standby.sh
はパラメータを使用して呼び出されたことを確認し、flock
その場合はコードをバイパスします。
if [[ "$1" != "subordinate" ]]
then
flock # with your arguments
fi
subordinate
スクリプトがコマンドライン引数を使用している場合は、このメカニズムを使用することもできますが、引数が指定されていることを確認するには明確にソートする必要があります。