0

我一直在尝试使用 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

不知道我在这里做错了什么。

编辑

一点上下文。这是我从这个 repo开始编辑的东西。

在那里定义的被调用的服务backend运行良好(它在 cron 作业中也有相同的时间表,my_service但是当我在与它安排的日期不同的一天触发它时,它工作得很好)。我所做的是使用它自己的 yaml 文件创建一个附加服务,该文件看起来与它beckend.yaml自己my_service.py的. 从理论上讲,这应该可行,因为结构完全相同,但事实并非如此。dispacth.yamlcron.yaml

该服务最初是在标准环境中开发的,并且可以正常工作,当我将其移至 flex 环境时,问题就出现了。

编辑2:

问题实际上出在 Dockerfile 中,它调用了我没有使用的服务。

4

2 回答 2

2

编辑:

def get(self):可能有一些问题。

首先,get可以保留。其次,您无法发送self到该功能。将其更改为:

def get_service():

编辑2:

您还需要import logging在使用它的任何页面的顶部。而且,您还没有导入Flask它的组件:

from flask import Flask, request, render_template #  etc...
import logging
于 2018-10-04T15:04:16.227 回答
0

您的1 of month 10:00cron 计划规范很可能是罪魁祸首:它指定仅在每个月的第一天的 10:00 运行作业!定义 cron 作业计划

示例:对于1,2,3 of month 07:00计划,作业在每月前三天的 07:00 运行一次。

所以最后一次执行发生在 3 天前(如果当时部署了这个 cron 配置),直到 11 月 1 日才会发生其他尝试:)

将时间表更改为更易于测试的内容,例如every 5 minutesevery 1 hours在您满意它按预期工作时恢复更改。

于 2018-10-04T18:57:30.830 回答