# TServer

Apache のようにあらかじめ複数のプロセスを起動して接続を待ち受けるネットワークサーバプログラムを簡単に作れるようにするためのライブラリです。

## 必要なもの

- Ruby 1.6.8 以上

## ライセンス

このプログラムは Ruby ライセンスに従います。

## 機能

あらかじめ複数のプロセスを起動しておくことができます(デフォルト 5)。 すべてのプロセスがクライアントから接続されている時に新たな接続がされた場合は、自動的に新しいプロセスが起動します(最大プロセス数のデフォルト 50)。 各プロセスは接続が切断されても、次の接続のために生き続けますが、ある数だけ接続を処理すると死にます(デフォルト 50)。 また、接続が切断してから、新しい接続が一定時間来なくても死にます(でふぉると 100秒)。

親プロセスは次のシグナルを特別に扱います(次期バージョンでこの機能はなくなります)。

SIGTERM
  子プロセスをすべて終了させて自分も死にます。接続中の子プロセスは接続が切れるまで終了しません。
SIGHUP
  子プロセスをすべて終了させて新たな子プロセスを起動します。接続中の子プロセスは接続が切れるまで終了しません。
SIGINT
  子プロセスをすべて終了させて自分も死にます。接続中の子プロセスも強制的に終了させます。

## 使用例

以下はポート8888で起動し、クライアントに現在時刻を返すプログラムです。

    require "tserver"
    ts = TServer.new(8888)
    ts.start do |s|
      s.puts Time.now
    end

## クラスメソッド

TServer.new(port)
  ポートport で accept する TServer オブジェクトを返します。
TServer.new(IPaddr, port)
  IPアドレス IPaddr のポート port で accept する TServer オブジェクトを返します。
TServer.new(socket, ...)
  ソケット socket で accept する TServer オブジェクトを返します。socket は複数指定可能です。

## インスタンスメソッド

TServer#start {|s| ...}
  accept を開始します。クライアントから接続された場合はブロックが実行されます。 ブロック引数は通信用ソケット(accept の戻り値)です。
TServer#stop
  ループを抜け出し、start から復帰します。
TServer#close
  TServer.new で開いたソケットを閉じます。
TServer#sock
  ソケットを返します。複数のソケットで動作している場合は最初のものを返します。
TServer#socks
  ソケットの配列を返します。
TServer#min_servers, TServer#min_servers=n
  最小サーバプロセス数を返し/設定します。 サーバプロセス数がこの値以下になった場合は、この値までプロセスを起動します。
TServer#max_servers, TServer#max_servers=n
  最大サーバプロセス数を返し/設定します。 サーバプロセス数はこの値以上には起動しません。
TServer#max_request_per_child, TServer#max_request_per_child=n
TServer#max_use, TServer#max_use=n
  １プロセスあたりの最大接続数を返し/設定します。 この回数分の接続を処理したプロセスは終了します。 0 に設定すると終了しません。
TServer#max_idle, TServer#max_idle=n
  一度でも接続を処理した子プロセスは、接続待ち時間がこの値を超えると終了します。
TServer#on_child_start{...}, TServer#on_child_start=proc
  子プロセス生成時にブロックまたは proc を実行します。 proc は Proc クラスのインスタンスです。
TServer#on_child_stop{...}, TServer#on_child_exit=proc
  子プロセス終了時にブロックまたは proc を実行します。 proc は Proc クラスのインスタンスです。
TServer#terminate
  子プロセスを終了させます。接続中の子プロセスは接続が切れるまで終了しません。
TServer#interrupt
  子プロセスを終了させます。接続中の子プロセスも強制的に終了させます。
TServer#handle_signal, TServer#handle_signal=flag
  TServer 内部でシグナル(HUP,INT,TERM)を処理するかどうかを真偽値で指定します。 デフォルトは true です。
TServer#logging=flag
  flagが偽(false, nil)の場合はログを出力しません。 flagが :syslog の場合で、Syslog.opened? が真の場合に、info レベルで syslog にログを出力します。 それ以外の場合は、ログを標準エラー出力に出力します。 デフォルトは false です。

## 履歴

0.2.1 2004/05/20
  - TServer.logging 機能の追加。
  - 子プロセスの回収処理を変更。SIGCHLD を扱わないようにした。
0.2 2004/03/21
  - 内部構造を大きく変更。
  - stop, close, terminate, interrupt, handle_signal メソッドの追加。
  - on_child_start, on_child_exit でブロックも受け付けるようにした。
0.1.2 2004/05/18
  - $tserver_debug = true で、標準エラー出力にログを出力するようにした。
  - 子プロセスの回収処理を変更。SIGCHLD を扱わないようにした。
0.1.1 2004/03/02
  - プロセスがハングする可能性があるバグを修正。
0.1 2004/02/25
  - SIGUSR1 を取り扱わないようにした。
  - accept が競合しないようにロックファイルを使用するようにした。
  - 親子間の通信に個別の pipe を使うようにした。
0.0.8 2003/06/17
  - 複数のソケットを処理できるようにした。
  - 子プロセスの終了時に exit ではなく exit! を使用するようにした。
0.0.7 2003/04/27
  - Solaris で EAGAIN エラーになる問題を修正。
0.0.6 2003/04/17
  - TServer::new の引数で BasicSocket, Socket も受け付けるようにした。
  - SIGTERM, SIGHUP で接続中の子プロセスを終了させないようにした。
  - SIGINT で強制的に子プロセスを終了させるようにした。
  - 子プロセス終了時に、ごく稀に親プロセスが異常終了するバグの修正。
  - 親プロセス終了時に、子プロセスが残る場合があるバグの修正。
0.0.5 2002/12/03
  - on_child_start, on_child_exit 追加
0.0.4 2002/12/01
  - max_use 追加
  - 子プロセス起動のタイミングを変更
0.0.3 2002/11/20
  - max_idle 追加
0.0.2 2002/11/12
  - TERM,CHLD,HUP,USR1 に対するシグナルハンドラが事前に登録されている場合は、TServer の処理後にそれを呼び出すようにした。
0.0.1 2002/11/11
  - 公開

Last modified: Thu May 20 11:20:42 JST 2004