From: Hidetoshi NAGAI Date: 2008-02-24T22:56:50+09:00 Subject: [ruby-list:44696] Re: ”Rubyアプリケーションプログラミング”の伝言サーバの使い方 永井@知能.九工大です. 問題となっている個所の著者です. From: "Yangkook Kim" Subject: [ruby-list:44691] ”Rubyアプリケーションプログラミング”の伝言サーバの使い方 Date: Sun, 24 Feb 2008 19:34:31 +0900 Message-ID: <8d2eb1f0802240234h20387e18s5d60e0365dfd5a3c@mail.gmail.com> > キムと申します。オーム社から出版されている書籍、"Rubyアプリケーショ > ンプログラミング"のP267~275に掲載されている伝言サーバー&クライアン > トの利用の仕方がわかりません。質問を要約すると次の2点です。 > 1、サーバーが正常に起動されているかどうかわからない。 作業ディレクトリ (デフォルトでは /var/tmp/Dengon) に プロセス番号を記録した .pid というファイルが存在していれば 稼働中であると判断してもらえばいいでしょう. とはいえ,異常終了して .pid ファイルが消されずに残った可能性もあるため, 本当に動いているかどうかは,.pid に書かれた番号のプロセスが 実際に存在しているかを調べねばなりません. 実行時の情報は作業ディレクトリの .log というファイルに 記録するようになってますから,そちらもチェックしてください. このプログラムは (というかこの本は) Ruby 1.6 の頃のものなんですが, Ruby 1.8.6 で動かすとエラーで終了してしまいますね.(^_^; # fork 時の挙動の変化が原因かな. Ruby 1.8.6 で動かすためには,dengon-server.rb の 110 行の ------------------------------------------------------------------- io.close unless io == pid_file || io == STDERR ------------------------------------------------------------------- を ------------------------------------------------------------------- io.close unless io.closed? || io == pid_file || io == STDERR ------------------------------------------------------------------- に修正してください. そうすれば Ruby 1.8.6 でも,サーバプログラムがデーモンとして きちんと稼働してくれると思います. > 2、書き込みクライアントで入力をサーバーに送信する方法がわからない。 多分,サーバがきちんと稼働していないため通信ができていないだけでしょう. 上記のように修正してサーバがきちんと動くようになれば 送信もうまく行くのではないかと思います. > 自分の試した手順は、サーバーをRoot権限でPort88888で起動。 他の方が述べているように 88888 ではまずいです. > しかし、このサーバーのスクリプトの275〜276行目で表示される > はずの"Start Dengon Server at...."が表示されることなくスクリプトが > 終わります。 この内容は正常にサーバが稼働した場合でも端末には出力されません. 90 行のところで STDERR の出力先を変更していることに注意してください. 件のログは /var/tmp/Dengon/.log ファイルに記録されているはずです. > 次に書き込みクライアントを引数に伝言番号、ホスト名、ポート番号を入力 > して起動(dengon-write.rb(1, localhost, 88888)。すると標準入力で文 念のためですが,これは正しくは ------------------------------------------------------------------ dengon-write.rb 1 localhost 88888 ------------------------------------------------------------------ とコマンドラインで入力して起動しているのですよね? > 字を入力することができます。クライアントを終了することでサーバに送信 > されると思うのですが、標準入力で無限ループに入るので、強制終了でクラ > イアントを終了する以外思いつきません。読み込みクライアントを入力で利 > 用した伝言番号で起動しても、ERROR :no messageとなるので、サーバーに > メッセージが蓄積されていないことがわかります。 メッセージが蓄積されている場合は /var/tmp/Dengon/ に 伝言番号をファイル名としたファイルが存在するはずです. また /var/tmp/Dengon/.log ファイルを見ると, メッセージの読み書きの記録が確認できます. -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp