Cronが利用できない環境で自動実行を実現する方法1



PHP/PostgreSQL/cron/mod_rewriteが利用可能!!


cronとは、自動で(一定時間・一艇頻度などで)、特定のコマンドやshellスクリプトなどを実行する機能です。例えば一日に一度(アクセスの少ない時間帯=人が普通寝ている時間などに)、データベースのバックアップを取ったり、アクセスログをビジュアル化したHTMLを自動生成させることなどもできます。人間が寝ていても、どこかに出かけていても、勝手にやってくれます。とっても便利です。

ただ、cronは、一般的に負荷がかかるため、利用できないようになっているレンタルサーバ(このページでは、「共有サーバ」の意味。)が多いのが実情です。また、利用者が設定ミスをしたり、過剰に設定する(例えば1分おきに実行させるなどの暴走的利用法)とサーバ全体がこけてしまう場合があることも大きな理由です。

そんな中で、cronが利用可能になっている貴重なレンタルサーバはこちらのページにまとめましたが、不幸にもcronの利用が許可されていない環境下で、cronと同じことをやりたい場合の代替手段について、いくつか案をご紹介します。(どのような環境下でも動作することを保証するものではありません。)

(最終更新日:2006年4月25日)

1.基本的な考え方

シェルスクリプトをcronを使って実行させることが不可能といっても、それはサーバの機能であるcronを使って実行できないというだけであって、そのシェルスクリプト自体はいつでも実行可能なわけです。ただ、「自動」でというところで、サーバの機能を使えないということです。

サーバがやってくれないのであれば、他の手段で実行することができれば問題解決となります。下準備として、そのシェルスクリプトをPHPのSystem関数から実行させることができるPHPプログラムを準備します。(System関数の使用は、セーフモードの環境下では制限されますので、そのような場合はこの方法は無理かもしれません。System関数の利用法はPHPのマニュアルをご参照ください。)

そのPHPプログラム(URL。例:http://www.example.com/php/db_backup.php)に自動でアクセスする方法を考えればいいことになります。ここでは、4つの方法を紹介します。このページで紹介します「Windowsのタスクスケジューラ機能を使用する方法」と、次のページ以降で紹介する「一般サイト訪問者のアクセスがトリガーになるようにする方法」「フリーソフトを利用する方法」「MacOSXのUNIXコマンドを利用する」の4つです。

2.Windowsのタスクスケジューラ機能を使用する

特定URLにアクセスするVBScriptを作成し、そのVBScriptをタスクスケジューラで実行させるようにします。

処理の流れ
1.タスクスケジューラがVBScriptを実行 → 2. VBScriptによって、ブラウザが自動起動し、特定URLにアクセスする。→ 3.その特定URLでは、PHPプログラムが実行され、PHPプログラム内からシェルスクリプトが実行される。


VBScriptのソースは最も簡単に書けば、
のようになるはずです(もちろん、GoogleのURLではなく実際には別のURLをセットします)。しかし、これだと、ネットで調べ物をしている最中に、このタスクが割り込み、その該当URLが表示されたり、逆に、タスクが実行されその該当URLにアクセス中に、人間が別のURLの表示要求を出してしまうかもしれないため、結果的にタスクが実行されないことになります。そこで、IEユーザーの場合は、VBScriptでは敢えてFirefoxを起動するようにします。
Firefoxのインストールパスは人によって違うと思いますが、ここでは最も一般的なパスで指定してあります。

同様に、Firefoxを普段使っているユーザーが、VBScriptでIEを起動させ、タスクを実行させたい場合は、IEが起動するようにしていると、いろいろ問題がありますので、
のようにすればいいことになるでしょう。この例では、これをgoogle.vbsとして保存したことにして、以下、話を進めます。このgoogle.vbsをタスクスケジューラによって自動実行させれば良いのですが、その手順は以下の通りです。


a. コントロールパネルの「タスク」もしくは、Windowsのスタートメニュー→プログラム→アクセサリー→システム→タスク
を選択すると左のような画面が起動します。

ここで、「スケジュールされたタスクの追加」をダブルクリックしますと、
b. 「タスク ウイザード」が始まります。「次へ」をクリックします。
c. 自動実行させたいプログラムが一覧表示されますが、ここには出ていないはずなので、参照ボタンをクリックして、自動実行させたいVBScriptファイル(この例では、google.vbs)を選択して、「次へ」をクリックします。
d. タスクの実行頻度を選びます。毎日1回コンピュータを起動するのであれば、「コンピュータ起動時」にしておけば、1日1回確実に実行されることになります。ここでは、「日単位」を選ぶことにします。
e. 開始時刻を選択します。この時間にWindowsが起動していない場合は、このプログラムはその日は実行されないことになりますのでご注意。
f. パスワードを入力し、「次へ」をクリックします。
g. 完了ボタンをクリックすれば、完了です。


h. 確かに、タスクに追加されています。

フォルダーの表示に関する設定の違いによって、左の画像のような画面でない場合もあるかと思いますが、問題ありません。

(上の画像は、「表示」が「詳細」になっています。下の画像は「表示」が「縮小版」になっています。)





機能充実(cron/ssh/ImageMagick/GD)のレンタルサーバです。


タスクがうまく実行されないない場合
1.Task Scheduler(タスクスケジューラ)は起動していますか?
Windowsの動作を少しでも軽快にしようと、使っていないサービスを停止させたりしていませんか? この手の最適化ソフト(ユーティリティー)をご利用になっていて、意識しないうちに、タスクスケジューラを停止させてしまっている可能性があります。

マイコンピュータを右クリックし、「管理」を選びます。

「コンピュータの管理」画面が起動します。この中の「サービスとアプリケーション」の中の「サービス」を開きます。

同じような画面は、コントロールパネル→管理ツール→サービスによって起動できます。

ここで、Task Scheduler(タスクスケジューラ)が停止しているならば、「開始」してください。また、「スタートアップの種類」は「自動」にして(「Task Scheduler」を選択して、右クリックでプロパティを表示させれば変更可能です。)ください。


2.スリープによってタスクの実行が阻まれていませんか?
コントロールパネル→タスク(or 、Windowsのスタートメニュー→プログラム→アクセサリー→システム→タスク)でタスクの一覧を表示させます。

該当のタスクを選択して、右クリックします。プロパティを選びます。

設定タブを開くと左の画像のような画面になります。ここで、「タスクの実行時にスリープを解除する」のチェックを入れます。


3.セキュリティ関連ソフトによって、VBScriptの実行が阻止されていませんか?
例えば、ソースネクスト社のウイルス対策ソフト「ウイルス・セキュリティ2006」には、ローカル・パソコン上の個人情報などをリモート(悪意のある人間)に送信するのを防いだり、危険なプログラムが自動実行されることを防ぐために、警告が出ることがあります。

VBScriptを実行することによって、実際、ほとんど何でもできてしまうため、ユーザーが知らないところで、これらのプログラムが実行されると問題があるからです。

そのため、毎回、この「疑わしいスクリプトの活動」の警告が出て、「すべて許可」を手動で選ばないといけないため、本稿の目的である「Windowsスケジューラによってcronもどきを実現する」ということは、ウイルスセキュリティがインストールされている環境では難しいかもしれません。

同様に、Norton AntiVirus(ノートン・アンチウイルス)を使っている場合にも同様の警告が出る場合があります(左の写真はNorton AntiVirus 2005のもので、最新版のNorton Antivirus 2006ノートン・アンチウイルス 2006)でも警告が出るのかは試していませんが、恐らく同じなのではと思います)。ただ、Nortonの場合、この点については、ある意味、ウイルスセキュリティより賢いです。

問題があるかもしれないスクリプトについて、今回限りで許可するのか、「このスクリプトを認証する」を選ぶことで、「このスクリプトは(未来永劫)安全です」とお墨付きを与えることができるようになっています。「このスクリプトを認証する」を選べば、以後警告は出ません。(もちろん、自分が作成したVBScriptであることをしっかりと確認しないと、安全でないものに認証を与えると大変なことになりますので、十分に注意してください。)

参照:Nortonの開発元・シマンテック社の技術文書:「スクリプト遮断が警告を表示した場合の対処方法


4.そもそも、PHPプログラムにバグはないですか?
意外に確認を怠りがちですが、そのVBScriptの自動実行(Windows側)によるアクセスがなされるPHPプログラム(サーバ側)自体に不具合がないかチェックする必要があります。自動実行ではなく、手動で、ブラウザにそのURLを入力し、プログラムが実行されるか確認する必要があります。

もし、手動でのアクセス・テストでうまく動作しないならば、今度は、PHPプログラムの問題もしくはシェルスクリプトの問題など切り分けて考える必要があります。telnet/sshにログインして、そのシェルスクリプトの実行を問題なく出来る場合には、PHPのSystem関数の使用がサーバ事業者によって禁止されているだけなのかもしれませんし、単にシェルスクリプトの中身をフルパスで書き直せばいいだけ(パスが通っていないことが原因で動いていない)かもしれません。あるいは、PHPプログラムを実行するユーザー(CGI版PHPでないならばnobody、webuserなど)にシェルスクリプトを実行する権限がないことが原因かもしれません。


その他、マイクロソフト社の技術文書(タスク スケジューラのトラブルシューティング)をご参照ください。


ただ、正直、このやり方は、パソコンが起動していないといけないという根本的な問題があります。自分のパソコンを起動させていなくても、勝手に自動処理がされるような仕組みはないものでしょうか?

続いて、一般のサイト訪問者にその自動処理の一端を任せてしまう方法(もちろん、一般のサイト訪問者は普通にページを見ているだけです。)についてご紹介します。



東芝ダイレクトPCは、嬉しい全国送料無料です


← 失敗しないレンタルサーバの選び方に戻る