xinetd で No active service for file descriptor 0 とか。む〜ん[UNIXやLinux]
(2012-02-08 01:12:18) by shinoda


UDP プロトコルでデータ受信するプログラムを xinetd 経由で実行しようと思ってたんだけど、どうもうまくいかんなあ。

以下の環境でテストを実施。

・OS 及び xinetd

CentOS 6.2
xinetd 2.3.14
Perl 5.10.1

・/etc/services にサービス追加

hogehoge        50001/udp

・/etc/xinetd.d/hogehoge を作成

service hogehoge
{
        disable         = no
        user            = root
        wait            = no
        server          = /usr/local/bin/hogehoge.pl
        socket_type     = dgram

}

・テスト用サーバ(/usr/local/bin/hogehoge.pl)

#!/usr/bin/perl

$d = <STDIN>;
exit();

・テスト用クライアント(./udp_client.pl)

#!/usr/bin/perl

use IO::Socket::INET;

$c = IO::Socket::INET->new(
  PeerAddr => "localhost",
  PeerPort => 50001,
  Proto    => "udp"
) or die $!;

$c->send("hello");
$c->close;

これで、クライアントを実行すると、一応 xinetd 経由で hogehoge.pl は起動するのだが、いつまで経っても終了せず。

/var/log/messages に、

Feb  8 00:08:47 server1 xinetd[8188]: 1 descriptors still set
Feb  8 00:08:47 server1 xinetd[8188]: No active service for file descriptor 0

というメッセージが延々出続ける。

file descriptor 0 ってことは、標準入力(STDIN)がアクティブになってないってこと?どういうこと?
xinetd は自分が受信したデータを標準入力でプログラムに渡すのだが、No active service for file descriptor 0 だからそれがうまく渡せないということだよね?

なんでそうなるかがわからん。

以前(もう数年前のことだが)、tcp でデータを受け取るプログラムを xinetd 経由で動かしたことあるけど、こんなエラーが出たことはないでぇ〜
む〜ん・・・

自前でサーバ書くと、スポーンした子プロセスがゾンビ化したり、親プロセスが原因不明で固まったりって時の処理(監視も含めてね)考えたり、そのプログラム書くのが面倒だなあと xinetd 使おうと思ったんだけど・・・む〜ん・・・

「馬鹿め!○○設定をせんかい!」みたいな識者からのお叱りをお待ちしてます。

コメント投稿
次の記事へ >
< 前の記事へ
TOPへ戻る

Powered by
MT4i 3.0.8