我一直在尝试使用 GAE(用 Python 开发的代码(运行 cron 作业,但是当我触发作业时,它失败了,没有任何错误消息——我在日志中根本找不到任何东西。
对于我正在使用灵活环境的服务,正在发生这种情况。
这是我的文件结构:
my_service.yaml
看起来像这样:
service: my_service
runtime: custom
env: flex
env_variables:
a:
b:
my_service.app
如下所示:
from __future__ import absolute_import
from flask import Flask
from flask import request
import logging
import datetime
import os
import tweepy
from google.cloud import datastore
import time
logging.basicConfig(level=logging.INFO)
app = Flask(__name__)
@app.route('/Main')
def hello():
"""A no-op."""
return 'nothing to see.'
@app.route('/my_service')
def get_service():
is_cron = request.headers.get('X-Appengine-Cron', False)
logging.info("is_cron is %s", is_cron)
# Comment out the following test to allow non cron-initiated requests.
if not is_cron:
return 'Blocked.'
## data scraping and saving in Datastore
return 'Done.'
@app.errorhandler(500)
def server_error(e):
logging.exception('An error occurred during a request.')
return """
An internal error occurred: <pre>{}</pre>
See logs for full stacktrace.
""".format(e), 500
if __name__ == '__main__':
app.run(host='127.0.0.1', port=8080, debug=True)
然后我有一个具有此结构的dispatch.yaml
:
dispatch:
- url: "*/my_service*"
service: my_service
还有cron.yaml
:
cron:
- description: run my service
url: /my_service
schedule: 1 of month 10:00
target: my_service
不知道我在这里做错了什么。
编辑
一点背景。这是我从这个存储库开始编辑的内容。
其中定义的名为backend
的服务运行良好(它在 cron 作业中的计划也与my_service
相同,但是当我在与计划不同的一天触发它时,它工作得很好(。我所做的是使用自己的yaml文件创建一个附加服务,该文件看起来与beckend.yaml
完全相同,它自己的my_service.py
并将其添加到dispacth.yaml
和cron.yaml
中。从理论上讲,这应该有效,因为结构完全相同,但事实并非如此。
该服务最初是在标准环境中开发的,并且在那里工作,当我将其移动到 flex 环境时,问题就出现了。
编辑2:
问题实际上出在 Dockerfile 中,即调用我没有使用的服务。
编辑:
def get(self):
可能会有一些问题。
首先,get
可能会被保留。其次,您无法将self
发送到该函数。 将其更改为:
def get_service():
编辑2:
您还需要import logging
使用它的任何页面的顶部。 而且,您尚未导入Flask
及其组件:
from flask import Flask, request, render_template # etc...
import logging
您的1 of month 10:00
cron 调度规范很可能是罪魁祸首:它指定仅在每月第一天的10:00 运行作业! 从定义 cron 作业计划:
示例:对于
1,2,3 of month 07:00
计划,作业运行一个 时间在每个月的前三天的07:00。
所以最后一次执行发生在 3 天前(如果当时部署了这个 cron 配置(,直到 11 月 1 日才会发生其他尝试:)
将计划更改为更易于测试的内容,例如every 5 minutes
或every 1 hours
,并在您满意后还原更改,它按预期工作。