いままで
リモート先でジョブが終わったかどうかを確認する
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-ブラウザ:返り)
・ブラウザでは結果を受け取り、次画面表示
以降、これらのプログラムを詳しく見ていく。
リモート先でジョブが終わったかどうかを確認する
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-ブラウザ:返り)
・ブラウザでは結果を受け取り、次画面表示
以降、これらのプログラムを詳しく見ていく。