Estou usando socat
para interceptar mensagens UDP e enviá-las para um pipe nomeado:
socat UDP-LISTEN:9999,fork PIPE:/tmp/mypipe,append
Eu sou capaz de seguir esse tubo e ver todas as mensagens que ele recebe.
Eu gostaria de canalizar a saída de tail -f /tmp/mypipe
para sed
fazer algum pós-processamento das mensagens, mas infelizmente algumas delas não são terminadas por nova linha. Isso é um problema porque significa que várias mensagens UDP distintas podem estar na mesma linha e também porque tail -f /tmp/mypipe | sed ...
não passa a última linha se não for terminada.
Idealmente, eu gostaria de poder adicionar um delimitador de mensagens personalizado à medida que elas são enviadas ao meu pipe, para que eu possa encontrar facilmente os limites da mensagem. Se isso não for possível, existe alguma maneira de seguir esse arquivo e canalizar a linha final (potencialmente não terminada) para outro programa para pós-processamento?
Uma possibilidade que não envolve bifurcação é usar a
socat
saída detalhada em vez dos dados. Minha versão desocat -v
inclui o comprimento dos dados na saída detalhada, para que você saiba onde termina. Por exemplo,produzirá antes de cada item de dados (por exemplo
9430NONEWLINE
) um cabeçalho começando>
com a data e um comprimento.Use
sed
, que pode anexar uma nova linha com um único comando, para evitar a condição de corrida ao usarSYSTEM:"cat; echo \"\n\""
a saída:socat -u UDP-RECVFROM:9999,fork SYSTEM:"sed -e a\\\\"