为什么RPC调用在Linux上的Groovy呼叫的C程序中失败?
题
我们有一个用C编写的程序,该程序使用RPC与同一Linux服务器上的另一个程序(也用C编写)进行通信(在某些生产设置中,第二个C程序将在另一台计算机上,因此RPC而不是IPC)。
当从其他C程序,Cron或命令行调用时,它可以按预期工作,并且已经进行了很多年,因此可以肯定地说它可以正常工作。
从Groovy脚本中调用的同一程序显然在网络问题上失败。
在C程序中, svc_register(xprt, prognum, versnum, dispatch, protocol)
成功,但是
- 请求后在RPC服务器上:
clnttcp_create
失败的“连接拒绝” - 在RPC客户端等待答复:
select
在svc_fdset
失败EBADF
Groovy程序(仅出于完整性,在这里看不到太多):
[ "myprogram", "someoption", "someprogram" ].execute()
我们可以尝试查明和解决问题吗?
解决方案
显然,调用Groovy的基于RPC的C程序确实有效。
该问题可以缩小到“(int)sysconf(_sc_open_max)”的问题,该问题用于确定SVC_FDSET中的FDS(用于从RPC-Requests获取答复的结构)中的FD数量确实失败了。由Groovy的C计划。
其他提示
运行程序 strace
, ,查看系统调用是/正在失败。
检查是否 myprogram
具有输出或等待输入。如果您不读取输出或关闭输入,则将悬挂,从而导致RPC调用中的超时。创建一个读取的线程 in
和 err
的 myprogram
并关闭 out
:
def p = [ "myprogram", "someoption", "someprogram" ].execute()
p.out.close()
p.consumeProcessOutput()
不隶属于 StackOverflow