Правильное создание сценария обслуживания сервера

У меня есть две стандартные задачи обслуживания postgresql, которые требуют удаления устаревших строк из определенных таблиц моего веб-приложения.

На выполнение обеих требуется ~ 1 час соответственно.

В настоящее время каждая из этих задач обслуживания представлена ​​сценарием, который вызывается в назначенное время суток через crontab. Я стараюсь запланировать оба сценария с интервалом не менее ~ 2 часов между ними, так как я не хочу, чтобы между двумя задачами было какое-либо перекрытие.

У меня вопрос - могу ли я просто объединить два сценария в один, например:

#!/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

Обратите внимание, как задачи удаления вызываются одна за другой. Таким образом, я могу быть уверен, что задача 2 начнется только после завершения задачи 1. Я хочу подтвердить, что мое понимание правильное и есть ли какие-либо предостережения, которые мне нужно иметь в виду. Пожалуйста, порекомендуйте.

1
задан 25 June 2016 в 11:02
1 ответ

Возможно, ваш файл crontab теперь выглядит так:

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

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

1. Просто запланируйте одно задание cron, которое последовательно выполняет несколько сценариев :

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

и простой сценарий (который можно значительно улучшить, добавив дополнительную обработку ошибок и т. Д.) Уже сохранят последовательность и предотвратят запуск второго сценария, когда первый не был (еще) завершен успешно:

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

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

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

3. Используйте файл блокировки , чтобы предотвратить запуск одного задания cron до того, как другое завершится с flock , как описано в в этом Q&A

3
ответ дан 3 December 2019 в 18:34

Теги

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