序言:显然,我太傻了。
我想在Ruby中公开一个简单的UNIXSocket
,它接受来自连接客户端的单个命令,而不会在处理时阻塞其他连接,直到套接字关闭(STDLIB套接字执行),包括不支持客户端的超时在X秒内发送任何命令。我还想要的是Etc.getpwuid(socket.getpeereid.first).name
,或者:获取连接到该套接字的用户的用户名。
由于默认UNIXSocket
阻止了所有进一步的连接,我尝试使用EventMachine和Celluloid:
EventMachine的:
多个连接的工作方式类似于魅力,但无法访问客户端的UID
。此外,即使您可以设置客户端超时,文档也不会告诉您何时实际触发此操作。对此体验特别令人沮丧:EventMachine
上的某些方法(如get_peername
)未在任何googleable API文档中记录,因为它们隐藏在原生扩展中。不幸的是,即使在C-Code中,EventMachine中也没有getpeereid
的等价物,所以我最终对此表示赞同。
赛璐珞:我打开了一个普通的UNIXSocket,然后将任何打开的连接传递给async
赛璐珞监听器。这也保持接受连接,但当我尝试结束服务器进程时,Celluloid线程无法关闭(Terminating X actors
),即使我在内部正确socket.close
和Actor.current.terminate
我的listen
方法(通过async.listen
调用)。唯一能解决这个问题的是kill -9
。因为赛璐珞的文档告诉了我,我也尝试了celluloid-io
echo server example,但这给了我同样的结果,需要kill -9
。
我一直在考虑启动自己的处理程序线程解决方案,但那些缺少自动超时,我希望有人已经解决了这个看似基本的问题。
我希望我在这里遗漏一些东西。截至目前,我的印象是Ruby上的Unix套接字缺少最基本的成分:/