Правильный сценарий обслуживания моего сервера

У меня есть две рутинные задачи обслуживания 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 ответ

Решение

Может быть, ваш файл 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

Другие вопросы по тегам