Obtendo meu script de manutenção do servidor correto

1

Eu tenho duas tarefas de manutenção de postgresql de rotina que exigem a exclusão de linhas antigas de certas tabelas do meu aplicativo da web.

Ambos demoram ~ 1 hora para concluir, respectivamente.

Atualmente, cada uma dessas tarefas de manutenção é representada por um script, que é chamado em uma hora designada pelo crontab. Eu tento agendar os dois scripts com pelo menos um intervalo de ~ 2hr entre eles, já que não quero que haja qualquer sobreposição entre as duas tarefas.

A minha pergunta é - posso apenas juntar os dois scripts num só, como segue:

#!/bin/sh

dbname="dbname"
username="myuser"
psql -d $dbname -U $username << EOF
# task 1
delete from links_publicreply WHERE "submitted_on" < now() - interval '14 days' AND id NOT IN (SELECT latest_reply_id FROM links_link WHERE la$
# task 2
begin;
DELETE FROM links_vote WHERE link_id IN (SELECT id FROM links_link WHERE id NOT IN (select answer_to_id from links_publicreply) AND "submitted$
DELETE FROM links_photoobjectsubscription WHERE which_link_id IN (SELECT id FROM links_link WHERE id NOT IN (select answer_to_id from links_pu$
DELETE FROM links_link WHERE id NOT IN (select answer_to_id from links_publicreply) AND "submitted_on" < now() - interval '1 hour';
commit;
EOF

Observe como as tarefas de exclusão são chamadas uma após a outra. Desta forma, posso ter a certeza que a tarefa 2 só arranca quando a tarefa 1 estiver concluída. Pretendo confirmar se o meu entendimento está correcto ou se existem quaisquer advertências que tenha em mente. Por favor informar.

    
por Hassan Baig 25.06.2016 / 10:02

1 resposta

3

Talvez seu arquivo crontab agora se pareça com:

# My cronjobs:
* 2 * * * /scripts/task1.sh
* 4 * * * /scripts/task2.sh

Você tem várias opções em vez de esperar que o agendamento de duas tarefas cron suficientemente distantes seja suficiente para que elas não se sobreponham quando uma é executada um pouco mais do que o esperado:

1. Basta agendar uma única tarefa cron que execute vários scripts sequencialmente:

# My cronjobs:
* 2 * * * /scripts/nightly-tasks.sh

e um script simples (que pode ser muito melhorado com um pouco mais de tratamento de erros e tal) já preservará a sequência e evitará que o segundo script seja iniciado quando o primeiro (ainda) não tiver sido concluído com êxito:

#!/bin/bash
# /scripts/nightly-tasks.sh
/scripts/task1.sh && /scripts/task2.sh

2. Mesclar os scripts em um único script, como você fez, é perfeitamente válido, mas, dependendo da complexidade desses scripts existentes, nem sempre é a melhor solução.

No seu exemplo, ele deve funcionar, embora você possa considerar mover a instrução begin para torná-la uma única transação.

3. Use um arquivo de bloqueio para impedir que um trabalho cron inicie antes que outro tenha terminado com flock , conforme descrito em este Q & A

    
por 25.06.2016 / 11:54