pare as tarefas agendadas do cron enquanto o banco de dados estiver criando

0

temos tarefas multi-cron funcionando todos os dias em horários diferentes. Em algum momento, o script está sendo executado por muito tempo e bloqueia o banco de dados no momento em que configuramos um novo. O problema é que, um novo banco de dados não está mais criando a partir do script (devemos fazer todo o manual).

Como posso parar / freez / terminar todos os trabalhos, por exemplo, às 4:00 da manhã; esperar até a nova configuração do banco de dados e executá-lo novamente?

    
por Martin Gerlach 27.03.2017 / 18:23

2 respostas

0

No PostgreSQL, você pode verificar quais outros processos estão sendo executados por meio do pg_stat_activity vista do sistema. Se você puder reconhecer seu processo de longa duração, você poderia iniciar seu cron job verificando essa tabela. Se houver uma entrada para o processo de longa duração, aguarde. Você pode pesquisar o banco de dados de vez em quando, ou você pode usar o LISTEN / NOTIFY para sinal de que o banco de dados está pronto (isso pode exigir mudanças nos dois scripts)

A vantagem deste método é que ele funciona se ambos os scripts não estiverem sendo executados na mesma máquina, mas pode ser um pouco mais complexo para configurar corretamente.

    
por 27.03.2017 / 23:31
0

Modifique o processo de configuração do banco de dados para descartar um arquivo canário em /var/run (por exemplo, /var/run/db_freeze ) na inicialização e remova-o após a conclusão.

Modifique seus trabalhos cron para terminar imediatamente na inicialização, se esse arquivo existir.

Por exemplo, para o trabalho de longa duração:

#!/bin/bash
# long-running DB setup job
touch /var/run/db_freeze
trap 'rm -f /var/run/db_freeze' EXIT
do_stuff

E para os trabalhos 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

Se você quiser esperar que o processo mais longo seja concluído e, em seguida, iniciá-lo, em vez de exit ing, aguarde até que o canário desapareça:

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

Observe, no entanto, que sem o bloqueio das tarefas do cron, se o processo longo ultrapassar um ciclo cron , você pode acabar com duas instâncias simultâneas do trabalho cron aguardando para entrar em ação.

    
por 27.03.2017 / 19:53