Труба бесконечного потока во внутренний цикл?
Я видел много вещей о перенаправлении stdout на TCP-сокет, но нет реального примера того, как это сделать на практике, особенно когда поток вывода, генерируемый первой "командой", никогда не заканчивается.
Чтобы поговорить о чем-то конкретном, давайте возьмем такие программы, как серверы, которые обычно бесконечно выводят свой журнал на стандартный вывод (ну, пока они работают). Если вы перенаправите вывод в файл журнала на диске, то этот файл всегда открыт (поэтому не может быть прочитан другими?) И увеличивается до бесконечности, что в конечном итоге приведет к проблемам.
Это может быть хороший вопрос, но я не знаю, что он делает или как это сделать.
- Как перенаправить вывод команды во внутренний цикл?
- Я хочу убедиться, что данные отправляются КАЖДЫЙ раз, когда что-то записывается в стандартный вывод, и что канал не будет ждать завершения команды (в идеале никогда не происходит!). Это правильно?
- Если 2 имеет значение true, существует ли буферная система для отправки кусков данных, как только они достигают определенного размера?
- Не могли бы вы дать мне конкретные примеры командной строки, чтобы сделать выше?
заранее спасибо
1 ответ
Использовать netcat
- Установить netcat-традиционный
или netcat-openbsd
,
На стороне приемника откройте гнездо для прослушивания:
nc -l 1234
где
1234
номер порта для прослушивания. По умолчанию netcat использует TCP-сокет. Это будет работать непрерывно, пока не получит EOF. Если вам нужно отключить это, добавьте опцию-q -1
(отрицательный тайм-аут ожидания - см. справочную страницу).При желании перенаправьте вывод в файл или передайте его, например:
nc -l 1234 > mylogfile.log
На стороне отправителя запустите команду и направьте стандартный вывод в netcat:
mycommand | nc 123.45.67.89 1234
где
123.45.67.89
это IP-адрес слушающего конца и1234
снова номер порта.Это будет работать непрерывно (потоковая передача данных) до
mycommand
выводит EOF.
обсуждение
Как перенаправить вывод команды во внутренний цикл?
Я не уверен, что вы подразумеваете под "внутренним циклом", но перенаправление вывода - очень общий вопрос для вашей оболочки.
Я хочу убедиться, что данные отправляются КАЖДЫЙ раз, когда что-то записывается в стандартный вывод, и что канал не будет ждать завершения команды (в идеале никогда не происходит!). Это правильно?
Насколько мне известно, трубы в оболочке не будут ждать EOF для передачи данных.
Если 2 имеет значение true, существует ли буферная система для отправки кусков данных, как только они достигают определенного размера?
Да, общие буферы в каналах, как описано в предложении ignis в ignis: Вопрос по UL: отключить буферизацию в pipe.
TCP будет обрабатывать буферы на уровне TCP.