Ultimate Cron
設定可能なルール、プール管理、ロードバランシングを使用して、cronジョブを個別に並列実行する高度なcron管理モジュールです。
ultimate_cron
概要
Ultimate Cronは、DrupalのコアCronロジックをより強力で柔軟なシステムに置き換える包括的なcron管理ソリューションです。標準的なDrupal cron呼び出し方法(drush cron、crontabなど)との互換性を維持しながら、個々のcronジョブをきめ細かく制御できます。
このモジュールは、有効なモジュールからすべてのhook_cron()実装を自動的に検出し、それぞれに対して個別のcronジョブEntityを作成します。各ジョブは、プラグインベースのアーキテクチャを通じて、独自のスケジュール、実行パラメータ、ログ設定を個別に構成できます。
主要なアーキテクチャコンポーネントには、Scheduler(ジョブの実行タイミングを決定)、Launcher(ジョブの実行方法を制御)、Logger(実行履歴を記録)が含まれます。このモジュールは、複数のジョブ間で負荷を分散するためのskew(@)などの特殊オペレーターを含む拡張crontab構文をサポートしています。
Ultimate Cronはオプションでキューワーカー統合も提供し、各キューワーカーを個別に設定可能なcronジョブとして公開します。これにより、キュー処理の頻度と動作をきめ細かく制御できます。
Features
- すべてのhook_cron()実装を自動検出し、個別に管理可能なcronジョブに変換
- 交換可能なScheduler、Launcher、Loggerを備えたプラグインベースのアーキテクチャ
- ジョブ間の自動ロードバランシングのためのskew(@)オペレーターを含む拡張crontab構文
- 設定可能な保持ポリシーを備えたデータベースおよびCacheベースのログ記録
- 同一ジョブの同時実行を防止するロック管理
- UIとDrushの両方からの手動ジョブ実行、有効化/無効化、ロック解除
- 重大度レベル、実行時間の追跡、ユーザー帰属を含む詳細な実行ログ
- キューワーカーを個別のcronジョブとして公開するオプションのキューワーカー統合
- 長時間実行ジョブの進捗追跡
- スケジュール遅延の検出とステータスレポート
- 実行優先度を制御するためのドラッグ可能なジョブ並べ替え
Use Cases
リソース集約型ジョブをオフピーク時間に実行
Crontab schedulerを使用して、検索インデックス作成(search_cron)やサイトマップ生成(simple_sitemap_cron)などの重いジョブを低トラフィック時間帯に実行するようスケジュールします。例:'0 3 * * *'は毎日午前3時に実行されます。skewオペレーター(@)で複数の重いジョブを分散できます:'0+@ 3 * * *'により、各ジョブがわずかに異なる分に実行されます。
高頻度キュー処理
キューワーカー統合を有効にして、キューワーカーを個別のcronジョブとして公開します。'entity_update'のようなキューを毎分実行するように設定し、重要度の低いキューは長い間隔のままにできます。これにより、サーバーに負荷をかけずにキューのバックログを防止します。
cron問題のデバッグ
'drush cron:list --behind'を使用して、スケジュール通りに実行されていないジョブを特定します。'drush cron:logs job_name'で個別のジョブログを確認してエラーメッセージを確認します。Database loggerはデバッグ用に重大度レベルとスタックトレースを含む詳細な実行履歴を保持します。
複数サーバー間でのロードバランシング
スケジューリングルールでskew(@)オペレーターを使用して、ジョブ実行を自動的に時間分散します。複数のWebサーバーがcronを実行する場合、Serial launcherのロックメカニズムにより、各ジョブが1台のサーバーでのみ実行され、重複実行が防止されます。
暴走ジョブの防止
launcher設定でlock_timeoutを構成し、指定時間後にロックを自動解除します。ジョブがハングしたりロック解除せずにクラッシュした場合、ロックは期限切れになり、ジョブを再実行できます。管理者はUIまたは'drush cron:unlock'でスタックしたジョブを手動でロック解除することもできます。
cronの健全性監視
このモジュールはDrupalのステータスレポートと統合され、ジョブがスケジュール遅延している場合に警告を表示します。これを監視システムと統合して、cronの失敗を管理者に警告できます。
カスタムジョブの作成
モジュールのconfig/installまたはconfig/optionalディレクトリに設定Entityを追加してカスタムcronジョブを作成します。コールバックは様々な形式で指定できます:関数名、hook実装のmodule#hook形式、静的メソッドのclass::method、サービスメソッドのservice.name:method。
Tips
- スケジューリングルールでskew(@)オペレーターを使用して、ジョブ実行時間を自動分散し、すべてのジョブが同時に実行されるのを防ぎます
- 本番サイトではコアのAutomated Cronモジュールを無効にし、crontabまたはホスティングプロバイダーによる適切な外部cronトリガーを使用してください
- 'drush cron:run job_name --force'コマンドは、スケジュールを待たずにジョブをテストするのに便利です
- ジョブのウェイト(UIでドラッグして設定)は実行順序を制御します - 低いウェイトが先に実行されます
- Cache loggerは、完全な履歴が不要な高頻度ジョブに最適です
- 実行時間が変動する可能性のあるジョブには、早期のロック解除を防ぐために余裕のあるlock_timeout値を設定してください
- cron問題の早期指標として、ステータスレポートページの「スケジュール遅延ジョブ」警告を監視してください
Technical Details
Admin Pages 6
/admin/config/system/cron/jobs
検出されたすべてのcronジョブをドラッグ可能なテーブルで表示するメイン管理インターフェース。ジョブタイトル、モジュール、スケジュール、最終実行時刻、実行時間、実行ステータスを表示します。各ジョブの編集、実行、ロック解除、有効化/無効化、ログ表示の操作を提供します。ジョブをドラッグして並べ替え、実行優先度を制御できます。
/admin/config/system/cron/settings
Ultimate Cronがキューワーカー統合を処理する方法を設定するキュー設定ページ。有効にすると、キューワーカーは設定可能なスケジューリングを持つ個別のcronジョブとして公開されます。
/admin/config/system/cron/jobs/manage/{job_id}
個別のcronジョブを編集するための設定フォーム。ジョブのscheduler、launcher、loggerプラグインとそれぞれの設定をカスタマイズできます。
/admin/config/system/cron/jobs/logs/{job_id}
特定のcronジョブの実行履歴を表示します。各実行の重大度インジケーター、開始時刻、終了時刻、メッセージ、実行時間を表示します。
/admin/config/system/cron/jobs/{job_id}/run
スケジュールに関係なく、指定されたcronジョブを即座に実行します(ロックは尊重されます)。
/admin/config/system/cron/jobs/{job_id}/unlock
スタックしたcronジョブを強制的にロック解除し、再実行を可能にします。ジョブがまだ実行中の可能性があるため、注意して使用してください。
権限 3
Hooks 6
hook_pre_schedule
ジョブにスケジュールが問い合わせられる直前に呼び出されます。モジュールがスケジューリング動作を変更できます。
hook_post_schedule
ジョブにスケジュールが問い合わせられた後に呼び出されます。
hook_pre_launch
ジョブが起動される直前に呼び出されます。実行前のセットアップに便利です。
hook_post_launch
ジョブが起動された後に呼び出されます。launcher実装によってはhook_post_runの前後に呼び出される場合があります。
hook_pre_run
ジョブコールバックが実行される直前に呼び出されます。
hook_post_run
ジョブコールバックの実行が完了した後に呼び出されます。
Drush Commands 6
drush cron:list
すべてのcronジョブをステータス、スケジュール、最終実行情報とともに一覧表示
drush cron:run <name>
特定のcronジョブを即座に実行
drush cron:logs <name>
特定のcronジョブの実行ログを表示
drush cron:enable <name>
cronジョブを有効化
drush cron:disable <name>
cronジョブを無効化
drush cron:unlock <name>
スタックしたcronジョブのロックを解除
Troubleshooting 6
外部cronがDrupal cronを十分な頻度でトリガーするように設定されていることを確認してください(最も頻繁なジョブスケジュールと同等以上)。コアのAutomated Cronモジュールはページリクエスト時にのみ実行されるため、無効にしてください。'drush cron:list --behind'でスケジュール遅延のジョブを確認します。
前回の実行がロックを解除せずにクラッシュした可能性があります。'drush cron:unlock job_name'を使用するか、UIでロック解除をクリックしてください。最近のログでエラーを確認して原因を調査してください。
Ultimate Cronのロックメカニズムでは本来発生しないはずです。複数のcronトリガーが同時に発火していないか、またはlock_timeoutが短すぎないか確認してください。launcher設定でlock_timeoutを増やしてください。
キューワーカー統合はデフォルトで無効です。/admin/config/system/cron/settingsで「cronキュー処理をオーバーライド」にチェックを入れて有効にしてください。その後、'drush cr'を実行するか、「ジョブを検出」ボタンを使用してください。
Database loggerのクリーンアップ設定を調整してください。方法を「特定の数のログエントリのみを保持」に変更して保持数を減らすか、「指定した経過時間より古いログを削除」でより短い有効期限を設定してください。
コールバック関数が存在しなくなりました。提供モジュールがアンインストールされたか、関数が削除された可能性があります。孤立したジョブEntityを削除するか、モジュールを再インストールしてください。
Security Notes 4
- 「administer ultimate cron」権限は制限付きであり、cronジョブ実行の完全な制御を可能にするため、信頼できる管理者にのみ付与してください
- UIまたはDrushによる手動ジョブ実行は、監査目的でユーザー帰属とともにログに記録されます
- cronをトリガーしたユーザーに関係なく、一貫した権限を確保するため、ジョブは常に匿名ユーザーとして実行されます
- ロックIDは一意性のためにuniqid()を使用して生成されますが、暗号学的に安全とは見なされません