Вызвать удаленную программу с помощью socat и дождаться ее завершения

Мне нужно вызвать программу x на сервере foo из клиентской bar . Программа x загружается некоторое время, затем считывает ввод со стандартного ввода и передает вывод на стандартный вывод перед завершением. Я пытался использовать socat для этого.

На сервере foo я установил следующее:

socat -lmlocal2 TCP-LISTEN:4444,fork,reuseaddr,linger=6 SYSTEM:x

И чтобы вызвать команду, я запускаю это на клиенте bar :

echo "someinput" | socat - TCP:foo:4444

Когда я запускаю клиент с параметром -v, я вижу, что socat передает данные в foo , и если я запускаю top ] на foo Я вижу, что он вызывает x (что требует некоторого времени для запуска), но клиент на панели не ждет x для завершения, а socat на сервере foo сообщает об ошибке ввода-вывода.

Если я изменю команду SYSTEM на foo на «СИСТЕМА: сон 5; cat> / tmp / test; echo 'done'» , это правильно считывает, сколько данных я отправляю, и помещает в / tmp / test . Все входные данные передаются по сети и подаются на x , теряется только вывод x .

Как мне заставить клиента socat оставаться открытым, пока x не закончит запись в стандартный вывод и не закроет его? Я попытался добавить на сервер linger = 6 , но это не помогло.

0
задан 16 December 2019 в 18:50
1 ответ

Хорошо, я думаю, что у меня есть он: помещенный -t 10 и на клиенте и на сервер, и они будут оба ожидать спустя 10 секунд после EOF от клиента прежде, чем закрыть оба сокета.

Проподсказка: используйте много из -d для получения представления в то, что socat делает негласно, и создайте простой локальный тестовый сценарий, который можно легко воспроизвести.

0
ответ дан 30 December 2019 в 00:11

Теги

Похожие вопросы