Труба бесконечного потока во внутренний цикл?

Я видел много вещей о перенаправлении stdout в TCP-сокет, но нет реального примера того, как это сделать на практике, особенно когда поток вывода, генерируемый первой «командой», никогда не заканчивается.

Чтобы поговорить о чем-то конкретном, давайте возьмем такие программы, как серверы, которые обычно бесконечно выводят свой журнал на стандартный вывод (ну, пока они работают). Если вы перенаправляете вывод в файл журнала на диске, то этот файл всегда открыт (поэтому не может быть прочитан другими?) И растет бесконечно, что в конечном итоге приведет к проблемам.

Это может быть хороший вопрос, но я не знаю, что он делает или как это сделать.

  1. Как перенаправить вывод команды во внутренний цикл?
  2. Я хочу убедиться, что данные отправляются КАЖДЫЙ раз, когда что-то записывается на стандартный вывод, и что канал не будет ждать чтобы команда закончилась (никогда не бывает в идеале!). Это правильно?
  3. Если 2 равно true, существует ли буферная система для отправки кусков данных, когда они достигают только определенного размера?
  4. Не могли бы вы дать мне конкретные примеры командной строки для выполнения выше?

Заранее спасибо

2
задан 28 June 2013 в 13:06

1 ответ

Используйте netcat

  1. Установите netcat-Traditional Install netcat-traditional или netcat-openbsd Install netcat-openbsd .
  2. На стороне приемника откройте гнездо для прослушивания:

    nc -l 1234
    

    где 1234 - номер порта для прослушивания. По умолчанию netcat использует TCP-сокет. Это будет работать непрерывно, пока не получит EOF. Если вам нужно отключить это, добавьте опцию -q -1 (отрицательный тайм-аут ожидания - см. Man-страницу).

    При желании перенаправьте вывод в файл или передайте его по конвейеру, например:

    nc -l 1234 > mylogfile.log
    
  3. На стороне отправителя запустите команду и направьте stdout к netcat:

    ]
    mycommand | nc 123.45.67.89 1234
    

    где 123.45.67.89 - IP-адрес прослушивающей стороны, а 1234 - номер порта.

    Это будет выполняться непрерывно (потоковая передача данных), пока mycommand не выведет EOF.


Обсуждение

Как перенаправить вывод команды во внутренний цикл?

Я не уверен, что вы имеете в виду «внутренним циклом», но перенаправление вывода - очень общий вопрос для вашей оболочки.

Я хочу убедиться, что данные отправляются КАЖДЫЙ раз, когда что-то записывается на стандартный вывод, и что канал не будет ждать завершения команды (в идеале никогда не происходит!). Это верно?

Каналы в оболочке не будут ждать EOF для передачи данных, насколько я знаю.

Если 2 имеет значение true, существует ли буферная система для отправки фрагментов данных, только когда они достигают только определенного размера?

Да, общие буферы в каналах, как описано в предложение ignis в его комментарий : Вопрос по UL: отключить буферизацию в трубе .

TCP будет обрабатывать буферы на уровне TCP.

0
ответ дан 28 June 2013 в 13:06

Другие вопросы по тегам:

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