Python 每日cron运行因超过最大运行时间而终止

Python 每日cron运行因超过最大运行时间而终止,python,django,cron,openshift,Python,Django,Cron,Openshift,我不知道为什么我的cron运行了20分钟,它被终止了。在openshift上,如果运行cron,它会在5分钟后被杀死。如果你用nohup跑步,它会在20分钟后死亡。 这是我每天在cron_上的错误日志。文件update\u dave\u list运行了20分钟: Thu Nov 19 03:08:08 EST 2015: START daily cron run ___________________________________________________________________

我不知道为什么我的cron运行了20分钟,它被终止了。在openshift上,如果运行cron,它会在5分钟后被杀死。如果你用nohup跑步,它会在20分钟后死亡。
这是我每天在cron_上的错误日志。文件
update\u dave\u list
运行了20分钟:

Thu Nov 19 03:08:08 EST 2015: START daily cron run
__________________________________________________________________________
/var/lib/openshift/55a000094/app-root/runtime/repo//.openshift/cron/daily/update_dave_list:
WARNING:py.warnings:/var/lib/openshift/55a0000094/python/virtenv/lib/python2.7/site-packages/django_crontab-0.6.0-py2.7.egg/django_crontab/crontab.py:13: RemovedInDjango19Warning: django.uti$
  from django.utils.importlib import import_module
/usr/libexec/openshift/cartridges/cron/bin/cron_runjobs.sh: line 114: 181616 Killed                  $executor "$SCRIPTS_DIR"
Warning: daily cron run terminated as it exceeded max run time
__________________________________________________________________________
Thu Nov 19 03:28:09 EST 2015: END daily cron run - status=137
__________________________________________________________________________
问题是
update\u dave\u list
只需约20秒即可运行:
更新列表
内容:

#!/bin/bash
date
nohup /var/lib/openshift/55000094/python/virtenv/bin/python /var/lib/openshift/55000094/app-root/runtime/repo/wsgi/digrin/manage.py crontab run 18e10bf4fb745d8a480230a3 # update dave lists
date
输出:

Št nov 19 03:43:47 EST 2015
nohup: ignoring input and appending output to `nohup.out'
Št nov 19 03:44:05 EST 2015
问题还在于,如果有一个cron被杀死,我的其他日常cron都不会运行。 哦,这是代码,如果你想知道我在运行什么20秒:

def update_dave_list():
    # if settings.ON_OPENSHIFT:
    response = urlopen("http://www.dripinvesting.org/tools/U.S.DividendChampions.xls")
    excell = xlrd.open_workbook(file_contents=response.read())
    for sheet in range(0,3): #for champions, challengers and contenders
        worksheet = excell.sheet_by_index(sheet)
        list, created = List.objects.get_or_create(name=worksheet.name, short_name=worksheet.name,
                                                   source="http://www.dripinvesting.org/tools/tools.asp")
        num_rows = worksheet.nrows - 1
        curr_row = 5
        symbol_list = []
        while curr_row < num_rows:
            curr_row += 1
            symbol = worksheet.cell(curr_row, 1)
            if symbol.ctype != 1: #break if you are out of symbol
                break
                #print  cell.value.replace(".", "-")
            symbol_list.append(unify_symbol(symbol.value))
            industry = worksheet.cell(curr_row, 2)
            sector = worksheet.cell(curr_row, 77)
            years = worksheet.cell(curr_row, 3)
            try:
                list_stock, created = ListStock.objects.get_or_create(stock=Stock.objects.get(symbol=unify_symbol(symbol.value)))
            except ObjectDoesNotExist:
                AddStock.objects.get_or_create(symbol=unify_symbol(symbol.value))
                continue
            list_stock.industry = industry.value
            list_stock.years_paying = years.value
            if sector.ctype == 1:
                if list_stock.stock.sector == None:
                    sector_obj, created = Sector.objects.get_or_create(name=sector.value)
                    list_stock.stock.sector = sector_obj
                    list_stock.stock.save()
            list_stock.save()
            #add stocks to list
            list.stocks.add(list_stock)
        #delete removed stocks
        for list_stock in list.stocks.all():
            if list_stock.stock.symbol not in symbol_list:
                list.stocks.remove(list_stock)
    return
我在openshift上的每日cron文件夹如下所示:

#!/bin/bash
#/var/lib/openshift/55a0310e4382ec4b84000094/python/virtenv/bin/python /var/lib/openshift/55a0310e4382ec4b84000094/app-root/runtime/repo/wsgi/digrin/manage.py crontab run 18e10bf4fb92741b69745d8a480230a3 # update dave lists
drwx------. 2 55a00094 55a00094 4096 nov 22 17:55 .
drwx------. 7 55a00094 55a00094 4096 nov 22 17:39 ..
-rw-------. 1 55a00094 55a00094    0 nov 22 17:37 .gitignore
-rwxr-xr-x. 1 55a00094 55a00094  236 nov 22 17:37 update_dave_list
-rwxr-xr-x. 1 55a00094 55a00094  235 nov 22 17:37 update_dgr
-rwxr-xr-x. 1 55a00094 55a00094  244 nov 22 17:37 update_ex_dividends
-rwxr-xr-x. 1 55a00094 55a00094  250 nov 22 17:37 update_frequency
-rwxr-xr-x. 1 55a00094 55a00094  236 nov 22 17:37 update_industry
-rwxr-xr-x. 1 55a00094 55a00094  472 nov 22 17:37 update_stocks
-rwxr-xr-x. 1 55a00094 55a00094  243 nov 22 17:37 update_years_paying
-rwxr-xr-x. 1 55a00094 55a00094  252 nov 22 17:37 watcher
__________________________________________________________________________
Mon Nov 23 13:01:05 EST 2015: START hourly cron run
__________________________________________________________________________
/var/lib/openshift/55a000094/app-root/runtime/repo//.openshift/cron/hourly/add_stocks:
...
在我注释掉dave list update之后,这是cron_daily.log中的日志:

__________________________________________________________________________
Mon Nov 23 03:25:54 EST 2015: START daily cron run
__________________________________________________________________________
/usr/libexec/openshift/cartridges/cron/bin/cron_runjobs.sh: line 114: 28445 Killed                  $executor "$SCRIPTS_DIR"
Warning: daily cron run terminated as it exceeded max run time
__________________________________________________________________________
Mon Nov 23 03:45:54 EST 2015: END daily cron run - status=137
__________________________________________________________________________
我想这意味着我的所有文件都没有运行,错误在cron_runjobs.sh中。但我没有得到openshift的支持,报告错误也没有帮助(我在几周前报告了一个错误,目前还没有更新)。奇怪的是,我的日常cron不工作,每小时cron工作正常


编辑2: 我尝试重新启动cron盒带:

rhc cartridge remove cron -a <app>
rhc cartridge add cron -a <app>
我不知道现在该怎么办。如果启动了daily cron中的文件,则如下所示:

#!/bin/bash
#/var/lib/openshift/55a0310e4382ec4b84000094/python/virtenv/bin/python /var/lib/openshift/55a0310e4382ec4b84000094/app-root/runtime/repo/wsgi/digrin/manage.py crontab run 18e10bf4fb92741b69745d8a480230a3 # update dave lists
drwx------. 2 55a00094 55a00094 4096 nov 22 17:55 .
drwx------. 7 55a00094 55a00094 4096 nov 22 17:39 ..
-rw-------. 1 55a00094 55a00094    0 nov 22 17:37 .gitignore
-rwxr-xr-x. 1 55a00094 55a00094  236 nov 22 17:37 update_dave_list
-rwxr-xr-x. 1 55a00094 55a00094  235 nov 22 17:37 update_dgr
-rwxr-xr-x. 1 55a00094 55a00094  244 nov 22 17:37 update_ex_dividends
-rwxr-xr-x. 1 55a00094 55a00094  250 nov 22 17:37 update_frequency
-rwxr-xr-x. 1 55a00094 55a00094  236 nov 22 17:37 update_industry
-rwxr-xr-x. 1 55a00094 55a00094  472 nov 22 17:37 update_stocks
-rwxr-xr-x. 1 55a00094 55a00094  243 nov 22 17:37 update_years_paying
-rwxr-xr-x. 1 55a00094 55a00094  252 nov 22 17:37 watcher
__________________________________________________________________________
Mon Nov 23 13:01:05 EST 2015: START hourly cron run
__________________________________________________________________________
/var/lib/openshift/55a000094/app-root/runtime/repo//.openshift/cron/hourly/add_stocks:
...

但是daily cron不运行daily目录中的任何文件。

没有足够的声誉来添加评论,所以我必须添加一个答案作为评论


以防万一,您确定
urlopen()
可以在OpenShift上获取xls吗?可能是防火墙或其他东西阻止了这个请求。您应该在代码中添加更多日志。

好的,我想我发现了问题所在。
首先,我可以强制运行daily cron,如下所示:

/usr/libexec/openshift/cartridges/cron/bin/cron_runjobs.sh daily
#!/bin/bash
/var/lib/openshift/55a000094/python/virtenv/bin/python /var/lib/openshift/55a000094/app-root/runtime/repo/wsgi/digrin/manage.py crontab run 18e10bf4fb92741b69745d8a480230a3 # update dave lists
date
这是我在daily cron上的日志:

__________________________________________________________________________
Wed Nov 25 03:24:19 EST 2015: START daily cron run
__________________________________________________________________________
/var/lib/openshift/55a000094/app-root/runtime/repo//.openshift/cron/daily/update_dave_list:
WARNING:py.warnings:/var/lib/openshift/55a000094/python/virtenv/lib/python2.7/site-packages/django_crontab-0.6.0-py2.7.egg/django_crontab/crontab.py:13: RemovedInDjango19Warning: django.uti$
  from django.utils.importlib import import_module
Wed Nov 25 03:24:38 EST 2015
/usr/libexec/openshift/cartridges/cron/bin/cron_runjobs.sh: line 114: 375681 Killed                  $executor "$SCRIPTS_DIR"
Warning: daily cron run terminated as it exceeded max run time
我以为问题出在
更新列表上。但当我在
update\u dave\u list
文件中打印日期时,如下所示:

/usr/libexec/openshift/cartridges/cron/bin/cron_runjobs.sh daily
#!/bin/bash
/var/lib/openshift/55a000094/python/virtenv/bin/python /var/lib/openshift/55a000094/app-root/runtime/repo/wsgi/digrin/manage.py crontab run 18e10bf4fb92741b69745d8a480230a3 # update dave lists
date
我意识到日期已打印在日志中->
更新列表
成功完成!(
Wed Nov 25 03:24:38 EST 2015
)所以问题一定在openshift中,它不会结束
更新dave_列表
过程,或者正确拾取另一个文件,但在成功完成后会写入日志(这永远不会发生)。第二个想法更符合逻辑。我有一个文件,在本地主机上在20分钟内完成,但在openshift上它没有按时完成。我通过将这个长时间运行的cron拆分为多个部分(每小时一次的cron)修复了这个问题,现在它看起来运行正常。

谢谢你的帮助!我知道这里没有多少人使用Openshift,没有很多日志和信息,调试起来并不容易!再次感谢您的时间和帮助

您可以尝试向函数添加一些日志记录,以了解在cron上下文中运行时函数挂起的位置,或者有一种方法可以在该环境中手动运行。我猜是不同的环境导致了你的脚本挂起。嗨@Nathaniel,谢谢你的评论。我将检查是否可以找出cron在什么环境下运行,以及是否可以使用它。请检查我的EDIT1。什么是
cron\u runjobs.sh
第114行?我想这是一个运行cron的openshift文件。我不应该改变这一点。但我有一个问题,可能是什么问题。如果我是对的,我明天会发布答案。我已经在openshift上手动运行了代码,它将在20秒后结束。另外,当我取消注释
update\u dave\u list
时,它以错误结束:max run time。请检查EDIT1。我会添加日志,但我不能模拟cron。我需要等一天,等我做的每一个改变都发现它不起作用(我给了你赏金,因为没有其他答案。希望你现在可以发表评论;)@Lucas03非常感谢!