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

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

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

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

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

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

1 ответ

Решение

Использовать netcat

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

    nc -l 1234
    

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

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

    nc -l 1234 > mylogfile.log
    
  3. На стороне отправителя запустите команду и направьте стандартный вывод в 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.

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