お気に入り | 日本語 | ログイン

Python 用の cron を使用したスケジュール タスク

App Engine Cron サービスを使用し、指定した時間または一定の間隔で実行されるタスクのスケジュールを設定できます。これらのタスクは一般的に「cron ジョブ」と呼ばれます。cron ジョブは App Engine Cron サービスにより自動的に起動されます。この機能を利用すれば、日報のメール送信、キャッシュ データの 10 分間隔での更新、または集計情報の 1 時間ごとの更新などが可能になります。

cron ジョブは一日の中の指定した時間に URL を起動します。cron が起動した URL は、リクエスト時間の制限など、通常の HTTP リクエストと同じ制限や割り当てが適用されます。

アプリケーションには最大 20 個のタスクをスケジューリングできます。

cron.yaml について

アプリケーションのルート ディレクトリにある cron.yaml ファイル(およびapp.yaml)は、Python アプリケーションのスケジュール タスクを設定します。次に、cron.yaml ファイルのサンプルを示します。

cron:
- description: daily summary job
  url: /tasks/summary
  schedule: every 24 hours
- description: monday morning mailout
  url: /mail/weekly
  schedule: every monday of month 09:00
  timezone: Australia/NSW

cron.yaml の構文は YAML フォーマットで記述します。この構文に関する詳しい情報は、YAML ウェブサイトをご覧ください。

cron.yaml ファイルは、複数のジョブ定義から構成されます。ジョブ定義には url および schedule が必要です。また、オプションで description および timezone が指定できます。この説明は管理コンソールと開発サーバーの管理者インターフェースで表示されます。

url フィールドには、cron サービスが起動するアプリケーション内の URL を指定します。詳細については、cron のための URL のセキュリティをご覧ください。スケジュール フィールドのフォーマットは、スケジュール フォーマットで詳細に説明します。

タイムゾーンには、標準の zoneinfo のタイムゾーン名を記述します。タイムゾーンを指定しないと、スケジュールは UTC(GMT とも呼ばれます)となります。

スケジュール フォーマット

cron のスケジュールはシンプルな英語に近い形式で指定します。

次に、スケジュールの例を示します。

every 5 minutes
every 12 hours
2nd,third mon,wed,thu of march 17:00
every monday of month 09:00
1st monday of sep,oct,nov 17:00

ジョブを指定された時間に繰り返し実行する必要が無く、同じ間隔で繰り返し実行する必要がある場合は、every N (hours|mins|minutes) を使用します。ここで、N は数値を、hours または minutes で時間の単位を指定します。タスクを実行する最小の間隔は 1 分です。

さらに具体的に間隔を指定する場合、次のようにスケジュールを指定できます。

("every"|ordinal) (days) "of" (monthspec) (time)

かっこ([ ])は説明のために記述しています。また、クォートはリテラル表記を表します。

ここで

  • 「ordinal」には「"1st", "first"」などの条件をカンマ区切りのリストを指定します。
  • 「days」には曜日をカンマ区切りのリストで指定します(「"mon","tuesday"」など。長いフォーマット、短いフォーマットのいずれも使用できます)。
  • 「monthspec」には月の名前をカンマ区切りのリストで指定します(「"jan","march","sep"」など)。
  • 「time」には一日の中の時間を 24 時間表記で HH:MM の形式で指定します。

cron のための URL のセキュリティ

cron ハンドラは、app.yaml で定義された通常のハンドラです。スケジュール タスクが使用する URL をユーザーがアクセスしないように、その URL へのアクセスを管理者アカウントに制限できます。スケジュール タスクは管理者のみに許可された URL にアクセスできるように設定されています。URL を制限するには、app.yamllogin: admin をハンドラ設定に追加します。

次に、app.yaml の例を示します。

application: hello-cron
version: 1
runtime: python
api_version: 1

handlers:
- url: /report/weekly
  script: reports.py
  login: admin

詳細については、Python アプリケーション設定: ログインまたは管理者ステータスの要求をご覧ください。

cron ジョブをテストするには、管理者としてログインし、ブラウザからハンドラの URL にアクセスします。

cron サービスからのリクエストには HTTP ヘッダーも含まれます。

X-AppEngine-Cron: true

cron リクエストのみがハンドラを起動するように設定されていることを確認するには、ヘッダーをご覧ください。

cron ジョブのアップロード

appcfg.py を使用して cron ジョブをアップロードし、定義済みの cron ジョブの情報を参照できます。appcfg.py update を使用して App Engine にアプリケーションをアップロードすると、cron サービスは cron.yaml の内容で更新されます。appcfg.py update_cron を使用し、アプリケーション全体ではなく cron の設定だけを更新できます。

すべての cron ジョブを削除するには、cron.yaml が次の内容のみを含むように変更します。

cron:

appcfg.py cron_info コマンドを使用し、ジョブの実行時間を含めた cron ジョブの解析結果を表示できます。

appcfg.py cron_info で指定したタイムゾーンを正しく処理するには、pytz パッケージをインストールする必要があります。

管理コンソールでの cron サポート

管理コンソールを使用し、cron ジョブの状態を表示できます。サイド メニューの「Cron Jobs」リンクを選択し、ジョブの状態を表示します。表示結果には、ジョブの最終実行時間とその結果が含まれます。

管理コンソール メニューの「Admin Logs」ページを選択し、cron ジョブが追加または削除された時間を表示します。

開発サーバーでの cron サポート

Python SDK を使用する際、開発用 appserver には /_ah/admin/cron の cron ジョブを表示可能な管理者インターフェースが含まれます。

開発サーバーでは cron ジョブは自動的に実行されません。代わりに curl または同様のツールを使用してジョブの URL を起動するには、ローカル デスクトップの cron またはスケジュール タスク インターフェースを使用できます。