канал socat для передачи нескольких операций открытия-записи-закрытия и открытия-чтения-закрытия

- это инструмент синтаксического анализа JSON. Вы можете сделать это:

uuid=$(curl ...)
service_uuid=$(jq -r '.body.data.serviceUuid' <<<"$uuid")
echo "$service_uuid"
7260276c-5c3f-41d3-9329-3603acecb7e5

2
20.04.2017, 14:24
1 ответ

Ваша проблема в том, что вы не указали, что вам нужны однонаправленные трубы. На странице socat man объясняется, что в этом случае PIPE: подобен эху.

Вероятно, произошло то, что когда вы впервые записали дату в fifo 1, ваш socat прочитал ее, записал в fifo 2, затем заметил, что на fifo 2 есть вход, прочитал его и записал в fifo 1, и так далее, зацикливаясь, пока первый cat на fifo 2 не успел опустошить его, прежде чем socat прочитал его. После этого первый cat будет продолжать читать fifo, никогда не видя конца файла, и вы сможете продолжать записывать дату в fifo.

Вы можете увидеть это, если добавите опцию -v в socat, чтобы показать i/o.

Добавление -u для однонаправленного ввода-вывода делает то, что вы, вероятно, хотели, но теперь socat выйдет после записи и чтения даты, так что вам понадобится цикл для этого:

while socat -v -u PIPE:/tmp/pipe1 PIPE:/tmp/pipe2; do echo new; done &

В вашей версии tar вы можете поместить команду socat внутрь скрипта /tmp/chvol.


Если у вас есть настоящий ленточный накопитель, вы также можете рассмотреть решение с использованием nbd-server для экспорта блочного устройства по сети.

1
27.01.2020, 22:18

Теги

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