Linux

轉儲程序的標準輸入和標準輸出

  • February 15, 2014

我有兩個程序,比如說父母和孩子。Parent 啟動 Child 並通過 child 的 stdin 和 stdout 與其通信。

Parent <-> Child

這些程序使用文本協議,我需要對其進行調查。我想創建一個 bash 腳本,它將由父而不是子啟動。此腳本將啟動子程序,此外會將標準輸入和標準輸出流轉儲到日誌文件中。

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

bash 中有沒有辦法做我需要的事情,或者我需要使用 C 嗎?

最簡單的方法是使用tee將子項的輸入和輸出轉儲到兩個單獨的文件中,如下所示:

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

您可以使用tee-a參數 ( append ) 將兩個日誌寫入同一個文件,但我不太確定它們是按正確的順序交錯還是一個接一個地寫入:

#!/bin/bash
tee -a both.log | child | tee -a both.log

如果您使用命名管道,那麼您是否有子程序和父程序都沒有關係:

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

初始消息:

echo message > p1.fifo

p1的輸出:

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

p2的輸出:

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

引用自:https://unix.stackexchange.com/questions/115313