UDP プロトコルでデータ受信するプログラムを xinetd 経由で実行しようと思ってたんだけど、どうもうまくいかんなあ。
以下の環境でテストを実施。
・OS 及び xinetd
CentOS 6.2xinetd 2.3.14Perl 5.10.1
・/etc/services にサービス追加
hogehoge 50001/udp
・/etc/xinetd.d/hogehoge を作成
service hogehoge{disable = nouser = rootwait = noserver = /usr/local/bin/hogehoge.plsocket_type = dgram}
・テスト用サーバ(/usr/local/bin/hogehoge.pl)
#!/usr/bin/perl$d = <STDIN>;exit();
・テスト用クライアント(./udp_client.pl)
#!/usr/bin/perluse 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 setFeb 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 使おうと思ったんだけど・・・む~ん・・・
「馬鹿め!○○設定をせんかい!」みたいな識者からのお叱りをお待ちしてます。
電気ウナギ的○○
About Backコメント(0)
電気ウナギ的○○