前文: 明らかに、私はあまりにも愚かです。
UNIXSocket
X 秒以内にコマンドを送信しないクライアントのタイムアウトを含め、ソケットが閉じられる (STDLIB ソケットが行う) まで、処理中にそれ以上の接続をブロックすることなく、接続しているクライアントから単一のコマンドを受け入れる単純なものを Ruby で公開したいと考えています。またEtc.getpwuid(socket.getpeereid.first).name
、または: そのソケットに接続しているユーザーのユーザー名を取得します。
デフォルトではそれ以降のUNIXSocket
すべての接続がブロックされているため、EventMachine と Celluloid でそれを実行しようとしました。
EventMachine:
複数の接続は魔法のように機能しますが、クライアントのUID
. また、クライアントのタイムアウトを設定することはできますが、これが実際にいつトリガーされるかについて、ドキュメントには何も記載されていません。この経験について特にイライラさせられる: EventMachine
(のようなget_peername
) の一部のメソッドは、ネイティブ拡張内に隠されているため、Google 対応の API ドキュメントのいずれにも記載されていません。残念ながら、getpeereid
C コードでさえ EventMachine に相当するものがないため、最終的にはこれで解決しました。
Celluloid:通常の UNIXSocket を開き、開いているすべての接続をasync
Celluloid リスナーに渡しました。これも接続を受け入れ続けましたが、サーバー プロセスを終了しようとしたとき、Celluloidスレッドをシャットダウンできませんでした( Terminating X actors
) 。これを改善した唯一のものは. Celluloid のドキュメントでそう言われたので、エコー サーバーの例も試しましたが、必要な結果と同じ結果が得られました。socket.close
Actor.current.terminate
listen
async.listen
kill -9
celluloid-io
kill -9
私は独自のハンドラー スレッド ソリューションを起動することを考えていましたが、それらには自動タイムアウトがなく、誰かがこの一見基本的な問題を既に解決していることを望んでいました。
ここで何かが足りないことを願っています。今のところ、Ruby の Unix ソケットには最も基本的な要素が欠けているというのが私の印象です :/