Quantcast
Channel: ウィリアムのいたずらの、まちあるき、たべあるき
Viewing all articles
Browse latest Browse all 7270

Webサーバーからリモートサーバーに、非同期で処理実行

$
0
0
いままで

リモート先でジョブが終わったかどうかを確認する
http://blog.goo.ne.jp/xmldtp/e/cbbdbadaae9c2c8eea8ed8b2ed3cb0dd



CentOSでTomcat6
http://blog.goo.ne.jp/xmldtp/e/74e421dcdc3e1e6b2719d79f96d95c2f

を書いてきた目的なんだけど、じつは、こんなことをしたい。



■お題

 今、Webサーバーにアクセスして、そことは違う別のサーバー上(以下「リモートサーバー」と記す)で、処理を起動したい。

 しかし、この処理はとても時間がかかるので、(最低数分だが、平均30分以上、1〜2時間かも?)バックグラウンドで処理を実行したい。そして、処理結果をファイル
に書き出し、バックグラウンド処理は終了する。

 その結果をブラウザ上に表示したい



■方式の概要

(1−ブラウザ側)
・あるボタンがクリックされると、AJAXで、サーバーのExeActionを起動する。

(1−Webサーバー)
・ExeActionは、バックグラウンドで、SSHを使って、リモートサーバーの
 起動シェルをバックグラウンドで起動する。
 バックグラウンドなので、すぐに戻ってきて、結果をブラウザに返す。

(1−リモートサーバー)
・リモートサーバーの起動シェルは、行いたいジョブをバックグラウンドで
 起動する。この起動シェルは、一意になるような引数が与えられている。
 (たとえば、WebサーバーのセッションIDなど)

  起動時、起動中ファイルを作成する。
  起動ファイルは、ファイル名の一部に上記一意の名前を含む
  (例:一意名12345のとき、job12345.txt)

  処理を行い、処理終了後、処理内容を、結果ファイルに書き出し、
  起動中ファイルを削除する。
  結果ファイルには、ファイル名の一部に上記一意の名前を含む
  (例:一意名12345のとき、ret12345.txt)

(2−ブラウザ)
・1−Webサーバーで帰ってきたら、setTimeoutを使って、一定時間待ち、
 その後、リモートサーバーの処理が終了したか、AJAXでWebサーバーの
 ChkActionを呼び出す

(2−Webサーバー)
・ChkActionは、リモートサーバーに、ジョブが終了したかどうかを、
 SSHでリモートサーバーのチェックシェルを起動して、尋ねる

(2−リモートサーバー)
・リモートサーバーのチェックシェルは、lsコマンドを実行し、
 grepで、一意になるような引数の起動中ファイルが起動しているか
 どうかをフィルタし、そのような行があれば起動中、無ければ終了
 とみなし、Webサーバーに結果を返す

(2−Webサーバー:返り)
・ChkActionでは、結果を受け取り、処理中ならは、cont、
 終了していたらendを返す

(2−ブラウザ:返り)
・Webサーバーの結果に応じて、もし、cont(処理中)であれば、
 (2−ブラウザ)へ戻り、処理終了までチェックを繰り返す
 もし、endであれば、(3−ブラウザ)へ

(3−ブラウザ)
・処理結果を得るため、AJAXでRetActionを呼び出す。

(3ーWebサーバー)
・RetActionはSSHを使って、リモートサーバーの結果シェルを呼び出し、
 結果ファイルの内容を返すように求める

(3−リモートサーバー)
・結果シェルは、結果ファイルの内容を返した後、結果ファイルを削除する

(3−Webサーバー:返り)
・RetActionは、結果をブラウザに返す

(3−ブラウザ:返り)
・ブラウザでは結果を受け取り、次画面表示



以降、これらのプログラムを詳しく見ていく。


Viewing all articles
Browse latest Browse all 7270

Trending Articles