CORESERVERでMovable Typeの指定日投稿を使う

Movable Type には日時指定でエントリーを公開する機能があります。

これを使うと、「今日作ったエントリーを明日の昼12時に公開する」とか、そういう事が出来るので場合によっては便利。

今回これを使ってみようと思って色々と設定していったのですが、このブログの置き場として使っているコアサーバーの変な仕様のせいで結構面倒だったので、その辺りの事を中心に書いておこうと思います。

まず、Movable Type の公式ドキュメントに書いてある方法を確認します。

crontab を利用したスケジュールタスクの実行 (LinuxまたはUNIXサーバーの場合)

crontab とは、Linux や UNIX サーバー上で定期的にコマンドやスクリプトを実行する cron デーモンの設定ファイルです。crontab に登録することで、定期的に実行することができます。たとえば、毎時0分、20分、40分に実行する場合、次のように記述します。

0,20,40 * * * * cd /path/to/mt; ./tools/run-periodic-tasks

つまり、cron で MT のディレクトリに移動して、toolsフォルダの下にある run-periodic-tasks を実行すれば良い。
っと言う事です。

おお、簡単じゃんって感じですよね。
コアサーバー は SSH でログインできるので、crontab で設定してみました。

結果。
あっさり終了。

何の問題も発生せずに、パブリッシュされました。



っと思ったのですが、なんか変。
しばらく経つと cron の設定が消えてる...

っと思ったのですが、CORESERVER で cron の設定を行う場合は管理画面から行わないと駄目みたいですね。
管理画面がマスターになっていて定期的に cron の設定が上書きされるみたいです。

ただ、管理画面からの反映にも少し時間がかかるので、急いで設定したい場合には管理画面で設定した後に、crontab で同じものをあらかじめ登録しておくと良いかもしれません。

で、この管理画面が曲者で、/virtual/ユーザー名/ が頭に絶対につく感じになっている。
つまり、シェルスクリプトを作って、それを実行する事を前提にした作りになっていると言うことです。

そのため、普通にやろうとすると

cd /path/to/mt; ./tools/run-periodic-tasks

は無理。

仕方が無いので、面倒ですがシェルスクリプトを書きました。

#!/bin/sh
cd /path/to/mt
./tools/run-periodic-tasks

まぁ、そのままです。

で、テストで普通にシェルから実行してみました。

すると・・・

25314 Killed ./tools/run-periodic-tasks

と言ったようなエラーが発生します。

良く分からないのですが、成功する時は成功します。
ただ、失敗しだすと全然だめで、MT側も変な状態で止まっているように感じます。

私は、MT の記事の一覧では公開中になっているのに、ブログの方を見ると公開されていないという現象に遭遇しましたが、これも失敗したら必ずなるというわけではありません。

原因は不明です。
が、どうやら CORESERVER や XREA の仕様が原因の様ですね。

詳しい仕様の話になりますが、CGIで使えるメモリー量と、CRON、SSHなどのシェルで使えるメモリー量制限は別となっております。前者の方が多くなっています。
お使いのスクリプトなどの場合、CGIで実行できるようにしていただいた上で、wgetなどでCGI経由で動作させると回避できます。

つまり、普通に MT の管理画面で行った場合問題の無い記事の公開でも、シェルや cron から実行するとエラーになる可能性があるという事なんでしょうか?

となると、CORESERVER や XREA を使っている人は cron から run-periodic-tasks を叩く方法を使わないほうが良いのかもしれないって事ですね。
軽く検索しただけでも結構同じ現象にぶち当たっている人が多いみたいなので、ちょっと怖いです。

と言う事で別な方法を採用する事にしました。


余談ですが、ダミーのシェルスクリプトを用意する事で CORESERVER の cron でもいちいちシェルスクリプトを書かなくてもよくなります。

例えば、以下の様なシェルスクリプトを作って dummy.sh として保存します。

#!/bin/sh
ls > /dev/null 2>&1

で、corn の部分には以下の様に書きます。

dummy.sh; cd /path/to/mt; ./tools/run-periodic-tasks

これでもきちんと動作します。

dummy.sh;
の後に、任意のコマンドを書けば別にシェルスクリプトを用意し無くてもOKと言う事です。

他にも色々と cron を設定したい時やテストの時など、いちいちシェルスクリプトを用意するのが面倒な場合はお勧めです。


先程の Movable Type の公式ドキュメントを読み進めると、「ログ・フィードの取得時に実行」という記述があります。

ログ・フィードの取得時に実行
通常、ログ・フィードを取得した際に、スケジュールタスクを実行します。

つまり、ログ・フィードを叩けばパブリッシュされるという事です。

ログ・フィードとはシステムログのフィードの事です。
システムメニューのツールのログをクリックするとログが表示されます。


その画面の右側のメニューにある「ショートカット」の中にある「ログフィード」の URL が必要な URL です。

もし、「ログフィード」と言うリンクが無くて「Webサービスのパスワードを設定」っとなっていたら、リンク先でパスワードを設定すると「ログフィード」のリンクが表示されます。

で、テストしてみましたが確かにパブリッシュされます。
んなら、こっちの方が楽ですね。

以下の様なシェルスクリプトを作って cron に登録すれば終わりです。

#!/bin/sh
wget -O - "フィードのURL" > /dev/null 2>&1


が、CORESERVER の cron には実行間隔にも制限があり、1時間に1回までしか同じジョブを実行できません。
同じジョブを複数登録して数分おきに実行するとかも可能かもしれませんが、余りやりたくないですよね。

しかも、wget を使う場合 URL を叩くだけなので、別に CORESERVER で実行する必要はない訳です・・・

って事で、自宅サーバーに cron を登録しようと一瞬思いましたが、良く考えたら分単位で実行する必要もないので、しばらく CORESERVER に設定して様子を見ようと思います。