毎日異なる時間に実行されるいくつかのクローンタスクがあります。スクリプトを実行するのに時間がかかりすぎるため、データベースを一時的にブロックするため、新しいデータベースを作成する必要があります。問題は、新しいデータベースがスクリプトで作成されなくなったことです(すべての操作を手動で実行する必要があります)。
新しいデータベースが正しく設定されるのを待ってからやり直すには、どうすればすべてのタスクを停止/停止/終了できますか?
答え1
PostgreSQLでは、以下を実行している他のプロセスを確認できます。pg_stat_activityシステムビュー。長期実行プロセスを識別できる場合は、このテーブルを確認してクローン操作を開始できます。長期実行プロセスのエントリがある場合は待ちます。データベースを頻繁にポーリングするか、次を使用できます。リスニング/通知これで、データベースが準備されたことを示します(ただし、両方のスクリプトを変更する必要があるかもしれません)。
この方法の利点は、両方のスクリプトが同じシステムで実行されていない場合でも機能しますが、正しく設定するのが少し複雑になる可能性があります。
答え2
起動時にカナリアファイル/var/run
(たとえば/var/run/db_freeze
)を保存し、完了したら削除するようにデータベース設定プロセスを変更します。
cron
起動時にすぐに終了するようにジョブを変更します(ファイルがある場合)。
たとえば、長期実行ジョブの場合、次のようになります。
#!/bin/bash
# long-running DB setup job
touch /var/run/db_freeze
trap 'rm -f /var/run/db_freeze' EXIT
do_stuff
アクションcron
:
#!/bin/bash
if [[ -f /var/run/db_freeze ]]; then
# Bail due to process lock from long-running job
exit 2
fi
do_stuff
exit 0
ingの代わりに、より長いプロセスが完了するのを待ってから始めるには、exit
カナリアが消えるまで待つことができます。
#!/bin/bash
while [[ -f /var/run/db_freeze ]]; do
sleep 30
done
do_stuff
ただし、cronジョブ自体をロックせずに長いプロセスが1サイクルより長くかかる場合、ジョブの実行を待つ2つの同時ジョブインスタンスが発生する可能性がcron
あります。cron