Мне нужно вызвать программу x
на сервере фу от клиента бар. Программа x
загрузка занимает некоторое время, затем считывает ввод со стандартного ввода и передает вывод на стандартный вывод перед завершением. Я пытался использовать socat
для этого.
На сервере фу Я настраиваю следующее:
socat -lmlocal2 TCP-LISTEN:4444,fork,reuseaddr,linger=6 SYSTEM:x
И чтобы вызвать команду, я запускаю это на клиенте бар:
echo "someinput" | socat - TCP:foo:4444
Когда я запускаю клиент с -v, я вижу socat
передает данные в фу, и если я бегу top
на фу Я вижу, как он вызывает x
(что требует времени для запуска), но клиент на бар не ждет x
закончить, и socat
на сервере фу сообщает об ошибке ввода-вывода.
Если я изменю SYSTEM
командовать фу к "SYSTEM:sleep 5; cat > /tmp/test ; echo 'done'"
, он правильно читает, сколько ввода я его отправляю, и помещает в /tmp/test
. Все входные данные передаются по сети и поступают в x
, это просто результат x
что потеряно.
Как мне получить socat
клиент оставаться открытым до x
заканчивает запись в стандартный вывод и закрывает его? Я пробовал добавить linger=6
к серверу, но это не помогло.
ОК, думаю я понял: положил -t 10
на обоих клиентах и server, и они оба будут ждать 10 секунд после EOF от клиента, прежде чем закрыть оба сокета.
Совет: используйте много -d
чтобы получить представление о том, что Socat делает за кулисами, и создать простой локальный тестовый пример, который вы можете легко воспроизвести.