我有一个脚本可以在openshift上更新几千条记录。每次请求后,它会休息1秒钟。所以我不满足[5分钟] [1]。我正在使用nohup,但无论如何,openshift杀死了那个脚本。 这是我的nohup:
#!/bin/bash
nohup /var/lib/openshift/526ed6ba4382eca7ff000024/python/virtenv/bin/python /var/lib/openshift/526ed6ba4382eca7ff000024/app-root/runtime/repo/wsgi/digrin/manage.py crontab run 2d73136da64a34e81327609dd1dfe69b & # update_historic_price_cron
日志:
/var/lib/openshift/526ed6ba4382eca6ff000024/cron/bin/cron_runjobs.sh: line 111: 294808 Killed $executor "$SCRIPTS_DIR"
__________________________________________________________________________
Tue Apr 7 17:21:10 EDT 2015: END hourly cron run - status=137
__________________________________________________________________________
Warning: hourly cron run terminated as it exceeded max run time
________________________________________________________________
Openshift在20分钟后杀死它。有没有办法延长cron的运行时间?我只需要每年运行一次,但我已经把它放在每周一次。
答案 0 :(得分:0)
在每个请求之间休息1秒钟将使您的脚本运行更长时间,而不是在5分钟的时间内保存。您应该删除脚本的这一部分,以便它更快地运行。
另一个建议是批量运行您的更新,每次可以根据上次更新的时间戳或其他内容选择几百个更新。
使用&把你的脚本放到后台应该工作。你可以发布你正在使用的cron文件的内容吗?
答案 1 :(得分:0)
基本上我不知道如何避免20分钟的运行时间限制。但我使用了一些解决方法。如果需要,您可以每小时运行一次并在内部过滤已处理对象的数量。
将数据库对象划分为部分:
limit_per_query = int(Stock.objects.count() / 23) + 10
hour = datetime.now().hour
for stock in Stock.objects.all().order_by("symbol")[hour*limit_per_query:hour*limit_per_query+limit_per_query]:
stock.update() ...
如果你只需要每月/每年运行一次cron,你可以将它添加到每小时/每日cron文件夹然后限制方法:
def update_spinoff_cron():
if (datetime.now().day not in [1,2]):
print("I am not updating spinoff today :) may be tomorrow.")
return
spinoff_update()