Почему сбой вызова RPC в программе на C, вызываемой из Groovy в Linux?
У нас есть программа, написанная на C, которая использует RPC для связи с другой программой (также написанной на C) на том же сервере Linux (в некоторых производственных установках вторая программа на 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()
Что мы можем попытаться определить и устранить проблему?
3 ответа
Очевидно, что вызов C-программ на основе RPC из Groovy действительно работает.
Проблема может быть сужена до вопроса, что "(int)sysconf (_SC_OPEN_MAX)", который используется для определения количества fds в svc_fdset (структура, используемая для получения ответов от rpc-запросов), не работает в случае использования с помощью программы на C, вызываемой из Groovy.
Проверьте, myprogram
имеет выход или ждет ввода. Если вы не прочитали вывод или не закрыли вход, он зависнет, что приведет к таймаутам в вызове RPC. Создать поток, который читает in
а также err
из myprogram
и закрыть out
:
def p = [ "myprogram", "someoption", "someprogram" ].execute()
p.out.close()
p.consumeProcessOutput()
Запустите программу через strace
, чтобы увидеть, что системный вызов (ы) является / сбой.