Назад | Перейти на главную страницу

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

Мне нужно вызвать программу 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 делает за кулисами, и создать простой локальный тестовый пример, который вы можете легко воспроизвести.