Pourquoi un dans un programme C échec appel RPC appelé à partir Groovy sous Linux?
Question
Nous avons un programme écrit en C, qui utilise RPC pour communiquer avec un autre programme (également écrit en C) sur le même serveur Linux (dans certaines configurations de production, le deuxième programme C serait sur une autre machine, donc RPC au lieu de IPC).
Quand appelé d'autres programmes C, ou CRON la ligne de commande, il fonctionne comme prévu et a été fait depuis de nombreuses années, il est sûr de dire que cela fonctionne en général.
Le même programme, appelé à partir d'un script Groovy, échoue, apparemment avec des problèmes de réseau.
Dans le programme C, svc_register(xprt, prognum, versnum, dispatch, protocol)
réussit, mais
- sur le serveur RPC après la demande:
clnttcp_create
échoue avec "connexion refusée" - sur le client RPC en attente de réponse:
select
sursvc_fdset
échoue avecEBADF
programme Groovy (juste pour être complet, pas grand-chose à voir ici):
[ "myprogram", "someoption", "someprogram" ].execute()
Que pourrions-nous tenter d'identifier et de résoudre le problème?
La solution
Apparemment, appel à des programmes C-basés sur RPC de Groovy ne fait le travail.
Le problème pourrait être réduit à la question « (int) sysconf (_SC_OPEN_MAX) », qui sert à déterminer le nombre de fds dans svc_fdset (une structure utilisée pour obtenir des réponses de requêtes RPC-) ne manque en cas d'être utilisé par un programme C appelé à partir routinier.
Autres conseils
Lancez le programme par strace
, pour voir ce que l'appel système (s) est / sont défaillants.
Vérifiez si myprogram
a une sortie ou attend l'entrée. Si vous ne lisez pas la sortie ou de fermer l'entrée, il se bloque, entraînant les délais d'attente dans l'appel RPC. Créer un fil qui se lit in
et err
de myprogram
et à proximité out
:
def p = [ "myprogram", "someoption", "someprogram" ].execute()
p.out.close()
p.consumeProcessOutput()