Warum nicht ein RPC-Aufruf in einem C-Programm von Groovy auf Linux genannt?
Frage
Wir haben ein Programm, in C geschrieben, dass RPC-Anwendungen mit einem anderen Programm zu kommunizieren (auch in C geschrieben) auf demselben Linux-Server (in einigen Produktions-Setups, das zweite C-Programm würde auf einem anderen Rechner, daher RPC statt IPC).
Wenn Sie von anderen C-Programmen aufgerufen, CRON oder die Befehlszeile, es funktioniert wie erwartet und wurde dabei so seit vielen Jahren, so ist es sicher zu sagen, es funktioniert im Allgemeinen.
Das gleiche Programm, von einem Groovy Skript aufgerufen, fehlschlägt, offenbar mit Netzwerkproblemen.
In dem C-Programm, svc_register(xprt, prognum, versnum, dispatch, protocol)
erfolgreich, aber dann
- auf dem RPC-Server nach Anfrage:
clnttcp_create
schlägt mit "Verbindung abgelehnt" - auf dem RPC-Client auf Antwort warten:
select
aufsvc_fdset
nicht mitEBADF
Groovy-Programm (nur der Vollständigkeit halber, nicht viel zu sehen hier):
[ "myprogram", "someoption", "someprogram" ].execute()
Was könnten wir versuchen, das Problem zu lokalisieren und zu beheben?
Lösung
Offenbar RPC Aufruf basierte C-Programme von Groovy tut in der Tat Arbeit.
Das Problem verengt werden könnte, um die Frage nach unten, dass „(int) sysconf (_SC_OPEN_MAX)“, der verwendet wird, um die Anzahl der fds in svc_fdset (eine Struktur verwendet, Antworten von rpc-Anfragen zu erhalten), um zu bestimmen, falls nicht scheitern von von einem C-Programm verwendet wird, von Groovy genannt.
Andere Tipps
Führen Sie das Programm durch strace
, um zu sehen, was Systemaufruf (e) ist / sind, versagen.
Überprüfen Sie, ob myprogram
ausgegeben hat oder wartet auf die Eingabe. Wenn Sie nicht über die Ausgabe lesen oder die Eingabe zu schließen, dann wird es hängen, zu Timeouts in dem RPC-Aufruf führt. Erstellen Sie einen Faden, der in
und err
von myprogram
und in der Nähe out
lautet:
def p = [ "myprogram", "someoption", "someprogram" ].execute()
p.out.close()
p.consumeProcessOutput()