Cron
Moodleの「cron」プロセスはバックグラウンドで定期的に実行される (標準的なMoodleインストレーションの一部の) PHPスクリプトです。Moodle cronスクリプトは異なるスケジュール間隔で異なるタスクを実行します。
重要: あなたのMoodleサーバのcronプロセスの設定を省略しないでください。あなたのサイトはcronプロセスの設定なしでは正しく動作しません。
ごみ箱を使用する場合、非同期で活動を削除する必要があるため、1分ごとのcron実行を推奨します。
cronプログラム (Moodleスクリプトを実行) はUnixベースのシステム (LinuxおよびOSXを含む) の中核部分であり、時間に依存するあらゆるサービスを実行するために使用されます。Windowsの場合、最も簡単な解決策はWindowsタスクスケジューラでタスクを作成して定期的に実行するよう設定することです。共有ホスティングではcronがどのように設定されているかドキュメントを探す (またはサポートに問い合わせる) 必要があります。ほとんどの共有ホスティングシステムではサイトを管理するためにCPanelが使用されているため、通常管理ページ内にCron Jobsセクションがあります。
基本的にこのタスクはあなたのシステムのcron活動リストに1行のコマンドを追加して設定します。Unixベースのシステムではこのリストは「crontab」と呼ばれるファイルであり、すべてのユーザが持っています。
一般的なディスカッション
サーバのタイプに関して、後のセクションを参照してください。 このセクションには一般的な背景情報が含まれます。
cronの導入には基本的に2つのステップがあります:
- 実行すべき正しいコマンドを特定する
- コマンドを実行する正しい場所をシステム上で見つける
Moodleのcronコマンドを使いこなす
MoodleにはMoodleインストール内で異なるスクリプトを使用する2つの異なるcron配置方法があります。これらは以下のとおりです ...
- CLI (コマンドラインインタープリタ) スクリプト。これには次のパスでアクセスできます:
/path/to/moodle/admin/cli/cron.php
疑わしい場合、このスクリプトを使用してください。このスクリプトはコンピュータのPHP CLIプログラムで実行する必要があります。そのため、最終的なコマンドは次のようになります:/usr/bin/php /path/to/moodle/admin/cli/cron.php
あなたのコマンドラインでこれを試してみて、うまくいくかどうかご確認ください。
注意: あなたのコマンドラインPHPバージョンが選択したMoodleバージョンと互換性があることを確認してください。コマンドラインのPHPプログラムはあなたのウェブサイトを実行しているものとは異なり、常に同じバージョンであるとは限りません。
- 何らかの理由でCLIスクリプトを実行できない場合、ウェブベースのスクリプトがあります。これは現在非推奨であり、将来のバージョンでは削除される可能性があることに留意してください。これはウェブブラウザから実行する必要があり、次のようなウェブURLでアクセスします: https://your.moodle.site/admin/cron.php あなたはコマンドラインベースのウェブブラウザ(例えばwget)を見つけることができるため、最終的なコマンドは次のようになるかもしれません:
/usr/bin/wget http://your.moodle.site/admin/cron.php
これには「どこからでも」実行できるという利点があります。もしあなたのマシンでcronが動作しない場合、他の場所で実行できます。
ウェブベースのMoodle cronコマンド
- あなたが選択できる場合、ウェブベースのcronは使用しないでください。これは将来のMoodleバージョンで削除される可能性があります。
- Moodle 2.9以降、cronジョブはデフォルトではウェブから実行できません。ウェブ経由で実行した場合、あなたには次のエラーメッセージが表示されます:
!!! Sorry, internet access to this page has been disabled by the administrator. !!!
- あなたは「ダッシュボード ► サイト管理 ► セキュリティ ► サイトセキュリティ設定」で「コマンドラインでのみcronを実行する」を選択解除してcronの実行可能場所を変更できます。
- あなたは次のように警告されます:「ウェブ経由でcronを実行することにより、匿名ユーザに機密情報を晒してしまいます。そのため、コマンドラインによるcronの実行またはリモートアクセスに対してcronにパスワードを設定することをお勧めします。」
- そしてあなたは「リモートアクセス用のCronパスワード」を設定できます。このフィールドが空白のままの場合、パスワードは要求されません。
- これはcron.phpスクリプトに以下の形式のURLでパスワードを渡さない限り、ウェブブラウザから実行できないことを意味します:
http://site.example.com/admin/cron.php?password=opensesame
コマンドを置く適切な場所を見つける
これは本当にあなたが使用しているシステムに依存するため、あなたのプラットフォームまたはホスティングのドキュメントを探して読む必要があります。ほとんどの場合、Moodle cronを実行するには正しいコマンド (前述) を作成した上で、そのコマンドおよび実行する時間をある種のファイルに追加します。これは特定のユーザインタフェイスを使用するか、ファイルを直接編集して設定できます。
CLIバージョンを使用する場合、あなたはcronプロセスが正しいユーザとして実行されていることも確認する必要があります。これはウェブ版では問題ありません。
例 ... Ubuntu/Debian Linuxにcronをインストールします。rootでログインしていると仮定して ...
crontabコマンドでwww-dataユーザ用のcrontabエディタウィンドウを開いてください。これはDebianベースのシステムでApache (ウェブサーバ) が実行するユーザです。
$ crontab -u www-data -e
ここではエディタウィンドウが開きます。cli cronスクリプトを1分ごとに実行するには以下の行を追加してください:
* * * * * /usr/bin/php /path/to/moodle/admin/cli/cron.php >/dev/null
注意: 最後の>/dev/null' ではすべての出力を'bin'に送って、あなたが1分ごとにメールを受信しないようにします。
あなたのシステムにcronを設定する
あなたのサーバのタイプに応じた情報を選択してください:
- UnixまたはLinuxでのCron - 様々なUNIXおよびLinux風味のオペレーティングシステム上でのCronサービスです。
- Windows OSでのCron - WindwosでのCronサービスです。
- Apple OSX - UnixまたはLinuxでのCronと全く同じビルトインの「crontab」サービスを使用してください。しかし、launchdを使った'アップル流'のやり方もあります - 詳細はMAC OS XでのCronをご覧ください。
- ウェブホスティングサービスでのCron- 様々なウェブホスティング例におけるCronサービスです。
以下、特定のホストに関する説明です (これらが最新であることを確認してください):
サードパーティのcronサービスを使用する
あなた自身のサーバ内で動作されているcronを使用する以外にサードパーティcronサービス (通常webcronと呼ばれます) を利用できます:
- cron-job.org は無料のサービスです (1分ごとのcron実行が可能です)。
- EasyCron - cronジョブを設定するためにcronタブまたは他のタスクスケジューラを必要としないウェブcronサービスプロバイダです。
- WebCron - 無料で簡単なウェブcronサービスプロバイダです。
Moodleのcron設定
管理者はサイト管理画面の「サイトセキュリティ設定」でコマンドライン経由のみでのcron実行の制限またはリモートアクセス用cronパスワードを設定できます。
リモートcron
「ウェブベース」バージョンのcronを使用する場合、Moodleサーバとは別のマシンにcronプロセスを配置しても、全く問題はありません。例えばUnixサーバ上のcronサービスでWindowsベースのMoodleサーバ上のcronウェブ「ページ」を呼び出せます。
スケジュールタスク
管理者は「管理 > サイト管理 > サーバ > スケージュールタスク」で極めて正確にタスクをスケジュールできます。詳細はスケジュールタスクをご覧ください。
複数のMoodleサーバでcronを実行する
- タスクは並列に実行できます。プロセスは同じMoodleインスタンスにサービスを提供する複数のウェブサーバからcronを起動できるよう、また同時にタスクが実行されないようロックを使用します。
- あなたが同じサーバ上で異なるMoodleインスタンスを動作させている場合、それぞれのMoodleインスタンスにcronジョブが必要です (単一のApacheウェブサーバでさえバーチャルホスト機能の使用で異なるドメイン上で異なるMoodleインスタンスを実行できます https://httpd.apache.org/docs/2.2/vhosts/index.html)。
スケジュールタスクをデバッグする
時々、特定のcronタスクが正常に動作しない場合があります。2.7以前のMoodleバージョンでは例外をスローするcronタスクは他のcronの実行を妨げていました。また、cronが毎回完了しているかどうかを監視する唯一の方法はcronの実行出力を自動チェックすることでした(例えば「Cron completed at」という文字列を検索する)。 Moodle 2.7およびそれ以降では1つのスケジュールタスクが失敗したとしても、残りのタスクの完了を妨げられることはありません。スケジュールされたタスクが1つでも失敗した場合、失敗としてマークされた上で再試行するようスケジュールされます。タスクが失敗し続けた場合、次のスケジュール時刻は最大でも24時間に1回試行されるまでに後退します。しかし、スケジュールタスク管理ページをチェックすることで、あなたは現在失敗しているタスクがあるかどうか確認できます (失敗したタスクを再試行する前に待つ秒数であるフェイルディレイが「0」ではない)。失敗したタスクをデバッグする簡単な方法はcliスケジュールタスクランナおよび出力の観察です。
ロギングおよびモニタリング
cronの出力をどこかに記録して問題がないかどうか監視することも理想的です。あなたは以下にアクセスしてcronの全体的なステータスを監視およびエラー有無を確認できます:
サイト管理 / レポート / システムステータス (/report/status/index.php)
あなたはまたCheck API (https://docs.moodle.org/dev/Check_API) CLIコマンドまたは https://github.com/catalyst/moodle-tool_heartbeat のようなプラグインの助けを借りて、このステータスレポートをIcinga / Nagiosのようなツールにも接続できます。
/admin/cli/checks.php
エラーがある場合、あなたはスケジュールされたタスクページのログカラムから最近実行されたタスク詳細を取得できますが、アドホックタスクの失敗は表示されません:
サイト管理 / サーバ / タスク / スケージュールタスク (/admin/tool/task/scheduledtasks.php)
アドホックタスクの失敗を確認するには自分でタスクを手動で再実行してエラーを確認するか、あなたが確認するためにログが収集済みである必要があります。シングルボックス上で動作するMoodleの場合、あなたは単純なログファイルにログを記録できます。クラスタの場合、syslogdまたは同様のものを使用できます。例:
* * * * * /usr/bin/php /path/to/moodle/admin/cli/cron.php 2>&1 | /usr/bin/logger ...
低遅延アドホックタスク
cronが実行されるたびにスケジュールされたタスクの後にアドホックタスクも実行されます。スケジュールされたタスクは最大でも1分間に1回しか実行できませんが、アドホックタスクはいつでもキューに入れることができます。一般的にあなたはできるだけ早く処理したいと考えるでしょうし、スケジュールされたタスクが最初に実行されるのを待つ必要もありません。もし、あなたが通常のadmin/cli/cron.phpのみを実行する場合、最初にすべてのスケジュールされたタスクを処理するために待つ必要があるだけではなく、もしすでに終了していれば次までcronが再スタートするのを待つ必要があります。
あなたは代わりにメインのcronプロセスと並行して実行される1つ以上の専用のアドホックタスクプロセッサを実行できます。
* * * * * /usr/bin/php /path/to/moodle/admin/cli/adhoc_task.php --execute --keep-alive=59 * * * * * /usr/bin/php /path/to/moodle/admin/cli/adhoc_task.php --execute --keep-alive=59 ...
Moodle 3.9以降、keep-aliveオプションはデーモンのように動作します。キューが空になった場合、キューを終了するのではなく、新しいタスクがキューに入るのを待ちます。そして、可能な限り早く処理を開始できるようにします。
複数プロセスでcronをスケールアップする
As your site grows many of the scheduled tasks will take longer to complete, and also there will be more ad hoc tasks queued which need to be processed. あなたのサイトが大きくなるに従って、スケジュールされたタスクの多くは完了するまでに時間を要するようになります。また、処理する必要のあるアドホックタスクがより多くキューに入るようにもなります。The cron system is designed to work in parallel but each individual process can only process one task at a time so you must run multiple cron cli's. cronシステムは並行して動作するよう設計されていますが、個々のプロセスは一度に1つのタスクしか処理できないため、複数のcron cliを実行する必要があります。You can generally run a fairly high number of cron processes on a dedicated cron instance before needing to run multiple cron instances. あなたは一般的に複数のcronインスタンスを実行する必要がある前に専用のcronインスタンスでかなり多くのcronプロセスを実行できます。To run more than one process simply spawn multiple cron processes each minute: 複数のプロセスを実行するには毎分複数のcronプロセスを起動するだけです:
* * * * * /usr/bin/php /path/to/moodle/admin/cli/cron.php * * * * * /usr/bin/php /path/to/moodle/admin/cli/cron.php * * * * * /usr/bin/php /path/to/moodle/admin/cli/cron.php ⋮ * * * * * /usr/bin/php /path/to/moodle/admin/cli/adhoc_task.php --execute --keep-alive=59 * * * * * /usr/bin/php /path/to/moodle/admin/cli/adhoc_task.php --execute --keep-alive=59 * * * * * /usr/bin/php /path/to/moodle/admin/cli/adhoc_task.php --execute --keep-alive=59 ⋮
adhoc_task.phpのプロセス数を増やすことは特に重要です。特定のプラグインおよびシステムでは極めて多くのアドホックタスクまたは処理に時間がかかるタスクが発生する場合があるからです。特にドキュメントの変換および自動バックアップ等のタスクはデフォルト設定のままの場合、処理するよりも早く溜まってしまう可能性があります。
デフォルトでは3つのスケジュールタスクおよび3つのアドホックタスクしか同時実行できないため、プロセスを追加するにつれて、あなたは許容される同時実行のレベルを上げる必要があります:
サイト管理 > サーバ > タスク > タスク処理
またはconfig.php
で:
$CFG->task_scheduled_concurrency_limit = 20; // デフォルト = 3
$CFG->task_adhoc_concurrency_limit = 50; // デフォルト = 3
あなたがこれらをどのように設定するにしても、ホスティングしているサーバがこれだけのプロセスを快適に処理可能であることを確認してください。多くの場合、ボトルネックは共有サービス、通常はデータベースです。
ある種非常に長時間実行されるタスクが利用可能なタスクプロセスをすべて消費してしまうため、あなたは他のタスクが実行されないことに気づくかもしれません。例えば5つのcliプロセスがあったとして、タスクキューに自動バックアップのための20のアドホックタスクがあり、それぞれが完了するのに10分を要する場合、あっという間に5つのプロセスすべてがバックアップに消費され、他のタスクが実行されなくなります。ドキュメントの変換またはフォーラムのメール送信等、高速で軽いタスクはバックアップが完了してプロセスが空くまで送信されません。これを管理するため、あなたは特定のタイプのアドホックタスクの同時実行を制限できます。 確かな経験則から判断した場合、仮にすべての 「重い 」タスクがそれ自身の制限をすべて消費してしまったとしても、キューに追加されるかもしれない他の何かを待つためにアイドル状態で待機しているプロセスがまだいくつかあるはずです。
自動化されたバックアップは最悪のリソース乱用者であることが知られているため、仮に50個のアドホックタスクロセスを同時実行している場合、合理的な制限として、バックアップの消費量をプロセスの半分以下、つまり最大でも25に抑制できます:
In config.php
:
$CFG->task_concurrency_limit = [
'core\task\course_backup_task' => 25,
'core_course\task\course_delete_modules' => 5,
];
関連情報
- スケジュールタスク
- cron機能に関するWikipedia記事
- MDL-50694 - Cronメッセージ「セッションロックを待っている間にタイムアウトしました」は実際にはエラーではありません。
フォーラムディスカッション:
- Windowsでスケジュールタスクの出力をログに記録する方法 - このディスカッションではWindowsのスケジュールタスクで問題が発生した際にスケジュールタスクの出力をログファイルに記録する必要がある場合に非常に便利なトリックについて説明しています。