正确获取我的服务器维护脚本

我有两个例行postgresql维护任务,需要从我的Web应用程序的某些表中删除老年行。

两者分别需要约1小时才能完成。

目前,这些维护任务中的每一个都是由一个脚本来表示的,这个脚本通过crontab在指定的时间被调用。 我试图安排两个脚本之间至less有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 

和一个简单的脚本(这可以通过一些更多的error handling等得到很大的改善)已经保留了序列,并防止第一个脚本在第一个脚本尚未成功完成时启动:

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

2.将脚本合并为一个脚本是完全有效的,但根据这些脚本的复杂性,并不总是最好的解决scheme。

在你的例子中它应该工作,尽pipe你可能想考虑移动begin语句来使它成为一个单一的事务。

3.如本Q&A所述, 使用locking文件来防止一个cron作业在另一个作业完成之前开始