我们有一个多 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
如果你想等待较长的进程完成,然后启动它,而不是exit
ing,你可以等待金丝雀消失:
#!/bin/bash
while [[ -f /var/run/db_freeze ]]; do
sleep 30
done
do_stuff
但请注意,如果不锁定 cron 作业本身,如果长进程的时间超过一个cron
周期,则最终可能会出现该cron
作业的两个并发实例正在等待执行操作。