stdin e stdout do processo de despejo

5

Eu tenho dois processos, digamos pai e filho. Pai lança o filho e se comunica com ele através de stdin e stdout da criança.

Parent <-> Child

Esses processos usam o protocolo de texto e eu preciso investigar isso. Eu gostaria de criar um script bash que será lançado pelo pai em vez de filho. Este script irá iniciar o filho e, além disso, irá despejar fluxos stdin e stdout para um arquivo de log.

Parent <-> MyProcess <-> Child
            |
            v
          log.txt

Existe alguma maneira no bash de fazer o que eu preciso ou eu preciso usar o C?

    
por Anthony Ananich 15.02.2014 / 16:14

2 respostas

6

A abordagem mais simples seria usar tee para despejar a entrada e saída do filho para dois arquivos separados, da seguinte forma:

#!/bin/bash
tee in.log | child | tee out.log

Você pode usar o parâmetro tee de -a ( append ) para gravar os dois logs no mesmo arquivo, mas não tenho certeza se eles serão intercalados à direita ordem ou apenas escrito um após o outro:

#!/bin/bash
tee -a both.log | child | tee -a both.log
    
por 15.02.2014 / 16:32
2

Se você usa pipes nomeados, não importa se você tem processos pai e filho:

p1:

#!/bin/sh
# p1

rm -f p1.fifo;mkfifo p1.fifo
trap "exit 1"  0 1 2 3 13 15

while read line; do
    echo p1 got "$line"
    echo p1 sending $line to p2
    echo $line > p2.fifo
    sleep 1
done < p1.fifo

p2:

#!/bin/sh
# p2

rm -f p2.fifo;mkfifo p2.fifo
trap "exit 1"  0 1 2 3 13 15

while read line; do
    echo p2 got "$line"
    echo p2 sending $line to p1
    echo $line > p1.fifo
    sleep 1
done < p2.fifo

mensagem inicial:

echo message > p1.fifo

a saída de p1:

p1 got message
p1 sending message to p2
p1 got message
p1 sending message to p2

a saída de p2:

p2 got message
p2 sending message to p1
p2 got message
p2 sending message to p1
p2 got message
    
por 15.02.2014 / 17:52