创建数据库时停止计划的 cron 作业

创建数据库时停止计划的 cron 作业

我们有一个多 cron 作业每天在不同的时间运行。有时,脚本运行时间太长,会及时阻止数据库,我们需要建立一个新数据库。问题是,不再从脚本创建新数据库(我们必须手动完成所有操作)。

我怎样才能停止/冻结/终止所有作业,例如凌晨 4:00;等到新的数据库设置良好并再次运行它?

答案1

在 PostgreSQL 中,您可以通过以下方式检查正在运行的其他进程:pg_stat_活动系统视图。如果您可以从中识别出长时间运行的进程,则可以通过检查该表来启动您的 cron 作业。如果它有长时间运行的进程的条目,请等待。您可以经常轮询数据库,或者您可以使用聆听/通知表示数据库现已准备就绪(但这可能需要更改两个脚本)

此方法的优点是,如果两个脚本不在同一台计算机上运行,​​它就可以工作,但正确设置可能会稍微复杂一些。

答案2

修改您的数据库设置过程,在启动时将金丝雀文件放入/var/run(例如/var/run/db_freeze),并在完成后将其删除。

修改您的cron作业,使其在启动时立即终止(如果该文件存在)。

例如,对于长时间运行的作业:

#!/bin/bash
# long-running DB setup job
touch /var/run/db_freeze
trap 'rm -f /var/run/db_freeze' EXIT
do_stuff

对于cron工作:

#!/bin/bash
if [[ -f /var/run/db_freeze ]]; then
    #  Bail due to process lock from long-running job
    exit 2
fi
do_stuff
exit 0

如果你想等待较长的进程完成,然后启动它,而不是exiting,你可以等待金丝雀消失:

#!/bin/bash
while [[ -f /var/run/db_freeze ]]; do
    sleep 30
done
do_stuff

但请注意,如果不锁定 cron 作业本身,如果长进程的时间超过一个cron周期,则最终可能会出现该cron作业的两个并发实例正在等待执行操作。

相关内容