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ネットワークプログラミング―ソケットの使い方からクライアント/サーバーシステムの開発まで

Perlネットワークプログラミング―ソケットの使い方からクライアント/サーバーシステムの開発まで

はてなフレームワークRailsCatalyst でおなじみのミニウェブサーバーを作ろうと思い買った本なのですが、とても役に立ちました。結局ミニサーバーのコードは Catalyst の server.pl のコードにインスパイアされて作りましたけどw

ちと分厚くて困りものですが、中盤ぐらいにメール系とかLWPなCPANモジュールについての章があり、そこは飛ばしてしまえばそれほどの分量でもないと思います。