我有两个常规的 postgresql 维护任务,需要从我的 web 应用程序的某些表中删除过期的行。
两者分别需要约 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
注意删除任务是如何被一个接一个地调用的。这样,我就可以确定只有任务 1 完成后任务 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 作业在另一个 cron 作业完成之前启动,flock
如下所述此问答