остановить запланированные задания cron во время создания базы данных

у нас есть несколько заданий cron, которые запускаются каждый день в разное время. Иногда скрипт работает слишком долго и вовремя блокирует базу данных, в которой мы настраиваем новую. Проблема в том, что новая база данных больше не создается из скрипта (мы должны делать все вручную).

Как я могу остановить / заморозить / завершить все задания, например, в 4:00 утра; дождаться завершения настройки новой базы данных и запустить ее снова?

0
27.03.2017, 19:23
2 ответа

В PostgreSQL вы можете проверить, какие еще процессы выполняются, с помощью системного представления pg_stat_activity . Если вы можете распознать свой длительный процесс по этому, вы можете запустить задание cron, проверив эту таблицу. Если в нем есть запись о длительном процессе, подождите. Вы можете время от времени опрашивать базу данных или использовать LISTEN / NOTIFY , чтобы сигнализировать, что база данных теперь готова (хотя для этого могут потребоваться изменения в обоих сценариях)

Преимущество этого метода в том, что что он работает, если оба сценария не запущены на одном компьютере, но его может быть немного сложнее правильно настроить.

0
28.01.2020, 04:47

Модифицируйте процесс установки вашей базы данных, чтобы при запуске бросить файл canary в /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

Если вы хотите дождаться завершения более длительного процесса, а затем отменить его, вместо exiting, вы можете подождать, пока канарейка исчезнет:

#!/bin/bash
while [[ -f /var/run/db_freeze ]]; do
    sleep 30
done
do_stuff

Обратите внимание, однако, что без работы над блокировкой самих заданий cron, если долгий процесс длится дольше одного цикла cron, вы можете получить два параллельных экземпляра задания cron, ожидающих начала работы.

0
28.01.2020, 04:47

Теги

Похожие вопросы