Мне нужно вызвать программу 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
, но это не помогло.
Хорошо, я думаю, что у меня есть он: помещенный -t 10
и на клиенте и на сервер, и они будут оба ожидать спустя 10 секунд после EOF от клиента прежде, чем закрыть оба сокета.
Проподсказка: используйте много из -d
для получения представления в то, что socat делает негласно, и создайте простой локальный тестовый сценарий, который можно легко воспроизвести.