【Movable Type】run-periodic-tasksを利用する
概要
MT(PowerCMS含む、以下同)で日時指定投稿(以下予約投稿)などに必要なrun-periodic-tasks
スクリプトの設定や留意点について解説しています。
本記事の解説は、以下環境での動作を対象としています。
- MT8(MT7やMT6でも同様です)
- ソフトウェア版(サーバーに設置して利用するタイプ / 記事執筆時点での最新バージョンは8.4.2)
- 一般的なレンタルサーバー、およびLinux環境で動作している標準的なWebサーバー
MTでは本体プログラムの/tools
ディレクトリ内にrun-periodic-tasks
というスクリプトが同梱されており、これをスケジュールタスクとして実行することにより、このスクリプトが実行されたタイミングで以下のことが可能になります。
- 記事の予約投稿
- ステータスが「公開キュー」に設定されたテンプレートの再構築
記事の予約投稿は公開日時を指定して記事を公開、また公開終了日時が指定してあれば記事を未公開(原稿)状態に戻します。
ステータスが「公開キュー」に設定されたテンプレートは通常の記事作成・更新時には再構築されず、run-periodic-tasks
が実行されたタイミングで再構築します。
run-periodic-tasks
を実行するにはいくつか方法がありますが、本記事では一般的なサーバーで利用できるcron(crontab)での設定について解説しています。なお、設定方法そのものについては解説していません。
利用方法
先述のとおり、MTで本体プログラムに同梱されているrun-periodic-tasks
を利用します。
このスクリプトはパーミッションを変更しなくても動く場合がほとんどだと思いますが、予約投稿や「公開キュー」ステータスのテンプレート再構築がうまくいかない場合は、CGIの実行権限(パーミッション)である755
(あるいは705
など)に変更してみてください。
(筆者は過去に自社サーバー(CentOS環境)で運用しているMTにおいて、パーミッションを変更しないと動かなかったということがありました)
cronの設定は、レンタルサーバーを利用していればサーバーのコントロールパネルから設定ができるかと思います。自社サーバー等の場合は、CLIでcrontabを設定することが一般的かと思います。
下記はさくらのレンタルサーバー(スタンダード)での設定例です。さくらの場合はそのままだと実行されるたびpostmaster
宛にメールが飛ぶので、末尾に1> /dev/null
を入れてメールが飛ばないようにしています。
cd /home/[ユーザーID]/www/mt; ./tools/run-periodic-tasks 1> /dev/null
設定は以上です。
留意事項など
run-periodic-tasks
を利用する際は、以下のことにご留意ください。
cron(crontab)設定を間違えないようにする
スクリプトパスの指定などすこしでも間違えると実行されないため、設定時はじゅうぶんお気をつけください。
また、設定は問題ないのに動作しない場合は、先述のとおりrun-periodic-tasks
にCGIの実行権限(パーミッション)付与を試してみてください。
また、設定後の動作確認・検証もじゅうぶん行うようにしてください。
スケジュールタスクはすべて同じタイミングで実行される
予約投稿とステータス「公開キュー」テンプレートの再構築は、run-periodic-tasks
が実行されたタイミングで両方とも行われます。どちらか一方のみ、またどちらかをキャンセルするということはできません。
ステータス「公開キュー」について
たとえば一覧ページのテンプレート(インデックステンプレートやリストアーカイブテンプレート)にこのステータスを指定しておくと、記事の公開・更新時(保存時)には該当のテンプレートは再構築されず、run-periodic-tasks
が実行されたタイミングでテンプレートを再構築します。これにより、記事の公開・更新時や管理画面左メニューから再構築した場合も該当テンプレートは再構築されないので、再構築時間の短縮・サーバー側の負担軽減が可能です。
記事数が多い場合は一覧の再構築にもそれなりの時間がかかってしまうため、可能であれば設定しておくとよいです。
なお、「公開キュー」に指定しているテンプレートでもテンプレート編集画面で「保存と再構築」ボタンを押下すると、その時点でテンプレートは再構築されます。また、「公開キュー」を指定していてもrun-periodic-tasks
が設定(実行)されていなければ、テンプレートは再構築されないのでご注意ください。
cron(crontab)の実行間隔と予約投稿の時間帯を合わせておく
たとえば以下の予約投稿記事があり、5分間隔でcron(crontab)を設定している場合、記事Bは公開されない可能性があります(筆者の経験ではほぼ公開されませんでした)
- 記事A(2025/4/7 13:00 公開)
- 記事B(2025/4/7 13:03 公開)
- 記事C(2025/4/7 13:05 公開)
cron(crontab)の実行間隔の間で設定されたもの(この場合は記事Bの公開日時)はスキップされることがあるため、予約時間はcron(crontab)の実行間隔に合わせたものを指定しておくとよいです。
なお、予約投稿については次の項目も併せてご確認ください。
複数の記事を同じ日時で予約投稿する場合
複数の記事を同じ日時で予約投稿設定している場合は、いくつかの記事が公開されない場合があります。
たとえば以下の3記事を予約投稿にしている場合、1つあるいは複数の記事(作成日が若いもの順)が公開されない場合があります。
- 記事A(2025/4/7 13:00 公開)
- 記事B(2025/4/7 13:00 公開)
- 記事C(2025/4/7 13:00 公開)
筆者の推測になりますが、run-periodic-tasks
が実行されるプログラムの処理速度などに問題があるのかなとも思っています(とてもいいスペックの環境で試したことがないので、なんともですが…)
複数の記事を同じ日時で予約投稿することはなるべく避けたほうが無難です。
公式リファレンス
MT
- https://www.movabletype.jp/documentation/schedule_task_framework.html
- https://www.movabletype.jp/documentation/mt7/installation/run-periodic-tasks/cron/
Discussion