我在 webfaction 上使用 Django 框架,并且有 5 个不同的 cron 作业。其中一个比其他的持续时间长得多,有时会卡住(30-120 秒或更长时间)。
我已经将该 cron 作业设置为每隔一分钟运行一次,但是,如果未完成,则会/home/aemdy/webapps/hvan/myproject/myfile.py
启动另一个进程,这会导致内存使用量高、站点工作速度慢并导致 apache 崩溃或内存泄漏。
我不想将其设置为*/3 * * * *
,但是,我想要类似的东西:
if this process in process list:
pass
else:
run process
这可以做到吗?
答案1
完成此操作的传统方法是让脚本在/var/run
启动时检查文件是否存在,如果不存在则创建一个包含其自己的 PID 的文件。完成后,脚本将删除该文件。如果该文件确实存在,则脚本将直接退出。这样,无论脚本调用的频率如何,它都只会执行尚未运行的主要代码。
这种方法的问题在于,不干净的终止会使该文件存在于系统上,因此通常会通过检查来增强它,以查看指定的 PID 是否存在以及该 PID 是否适用于正确的脚本。
此方法确实需要您更改脚本而不是简单地修改crontab
条目,但它是解决此类问题的历史悠久的机制。