xinetd 経由で SQL をたたくためのデーモン
Perlネットワークプログラミング―ソケットの使い方からクライアント/サーバーシステムの開発まで を読んでたら Chatbot::Eliza を使った簡単なスクリプトを、inetd 経由で動かしてデーモンとして動かすみたいな話がありました。inetd はその中で、標準入力や標準出力をクライアントとのソケットへ再オープンして、指定されたコマンドをデーモンとして実行するので、標準入出力を扱う簡単なプログラムを修正なしにデーモンとして動かすことができる、といったもの。
ということで、試しに簡単な Hack をしてみました。
#!/usr/local/bin/perl use strict; use warnings; use DBIx::DWIW; $| = 1; my $db = DBIx::DWIW->Connect( DB => 'mysql', User => 'nobody', Pass => 'foobar', Host => '127.0.0.1', ) or die $@; my $query = <STDIN>; my @records = $db->Arrays($query); my @results = map { sprintf qq!<column name="%s">%s</column>!, $_->[0], $_->[1] } @records; my $results = join "?n", @results; print <<EOF; <?xml version="1.0" ?> <result> $results </result> EOF
というスクリプトを dbi.pl とかして保存して実行ビットを立てておき、/etc/xinetd.d/mysql-status という設定ファイルに
service mysql-status { disable = no type = UNLISTED id = mysql-status-stream sock_type = stream protocol = tcp user = nobody wait = no port = 12001 server = /path/to/dbi.pl }
と書きます。これで xinetd 経由で dbi.pl を実行することができます。リモートの標準入力や標準出力は、dbi.pl を実行しているサーバーのソケットと繋がってるので、
[naoya@powerbook log]$ telnet 127.0.0.1 12001 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. show status like 'created_tmp_%' <?xml version="1.0" ?> <result> <column name="Created_tmp_disk_tables">180</column> <column name="Created_tmp_files">3</column> <column name="Created_tmp_tables">180</column> </result> Connection closed by foreign host.
みたいな感じで結果が帰ってくると。お手軽。
一応、サーバーのリソースを、リモートホストから取得したい、でもサーバーにインストールされてるプログラム(libmysqlclient とか httpd とか)には依存したくない、みたいなケースを考えてのサンプルですが、今回のサンプルはお遊びで作ったものなので実用性は疑わしいし、こういうときは素直に RPC::XML::Server あたりを使ったほうがいいと思います。
ところで、このPerlネットワークプログラミング本はすごくいい。CGI.pm や GD、Crypt::CBC などの開発者であるところのLincoln D. Stein氏の著書なのですが、スクリプト言語から入って、リモートの情報取得するときは lwp とか CPAN モジュール頼みみたいなことをずっとやってきて「ソケットなにそれ?」みたいな基礎すっ飛ばしな僕にとってはいままで目をつぶってきたその辺りの話が丁寧に解説されており、目から鱗なのでした。
Perlネットワークプログラミング―ソケットの使い方からクライアント/サーバーシステムの開発まで
- 作者: リンカーンスタイン,Lincoln D. Stein,クイープ
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2002/12
- メディア: 単行本
- 購入: 5人 クリック: 28回
- この商品を含むブログ (6件) を見る
はてなフレームワークに Rails や Catalyst でおなじみのミニウェブサーバーを作ろうと思い買った本なのですが、とても役に立ちました。結局ミニサーバーのコードは Catalyst の server.pl のコードにインスパイアされて作りましたけどw
ちと分厚くて困りものですが、中盤ぐらいにメール系とかLWPなCPANモジュールについての章があり、そこは飛ばしてしまえばそれほどの分量でもないと思います。