У меня есть две стандартные задачи обслуживания 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. Я хочу подтвердить, что я правильно понимаю, и есть ли какие-либо предостережения, которые мне нужно иметь в виду. Пожалуйста, порекомендуйте.
Возможно, ваш файл 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
как описано в этот вопрос и ответ