Потенциальное решение, которое может быть в целом применимо (с нетерпением ждем возможности услышать, если есть более эффективные альтернативы.
Во-первых, пример python сценария, который описывает вопрос:
some- script.py:
import sys
lines = sys.stdin.readlines()
print('>>>START-OF-STDIN<<<')
print(''.join(lines))
print('>>>END-OF-STDIN<<<')
Цель состоит в том, чтобы поток текста, поступающего из канала, был дифференцируемым.
Пример производителей:
cat a.txt | echo $(base64 -w 0) | cat > pipe &
cat b.txt | echo $(base64 -w 0) | cat > pipe &
cat c.txt | echo $(base64 -w 0) | cat > pipe &
cat d.txt | echo $(base64 -w 0) | cat > pipe &
cat e.txt | echo $(base64 -w 0) | cat > pipe &
Описание производителей:
cat
объединяет весь файл, а затем передает в echo
echo
, отображает текст, полученный из подкоманды $(base64 -w 0)
, и передает в cat
base64 -w 0
кодирует все содержимое файла в одну строку cat
, используемую в этом случае, объединяет полную строку перед перенаправлением вывода в канал. Без этого потребитель не ' не работает должным образом (попробуйте сами)
Пример потребителя:
tail -fn +1 pipe | while read line ; do (echo $line | base64 -d | cat | python some-script.py) ; done
Описание потребителя:
tail -fn +1 pipe
следует (-f
) по трубе с начала (-n +1
) с После завершения процесса и передачи содержимого в read
в пределах while
l oop - , в то время как есть строки для чтения (при условии, что закодированы base64 одиночные строки, поступающие от производителей), каждая строка передается в подпрограмму -shell
- В каждом подоболочке
echo
передает линию в base64 -d
(-d обозначает декодирование) base64 -d
передает в декодированную строку (которая теперь может занимать несколько строк) до cat
cat
объединяет строки и направляет их как одну к python some-script.py
- Наконец, пример сценария python может читать строки строка точно таким же образом, как
cat example.txt | python some-script.py
Выше было полезно для меня, когда хост-процесс не имел разрешений Docker, но мог передавать по конвейеру в файл FIFO (именованный канал), смонтированный как объем в контейнер. Потенциально несколько экземпляров потребителя могут происходить параллельно. Я думаю, что вышеупомянутое успешно дифференцирует входящий контент, так что изолированный процесс может обрабатывать контент, поступающий из именованного канала.
Пример команды Docker, включающей символы канала, et c:
"bash -c 'tail -fn +1 pipe | while read line ; do (echo $line | base64 -d | cat | python some-script.py) ; done'"