開始されたプロセスの出力をパイプできますか? [コピー]

開始されたプロセスの出力をパイプできますか? [コピー]

私が起動したと仮定すると、program標準出力にいくつかの出力を書き込む作業が進みます。パイプラインが生成する行数を計算できるようにパイプラインを追加する方法はありますかwc -l

答え1

Linuxではこれを行うことができます。スクリプトがあるとしますs

#!/bin/bash
i=0
echo my pid: "$$"
while true; do
    echo "$i"; ((i++)); sleep 1; 
done

走る:

$ ./s
my pid: 8815
0
1
2

それはすべてです。これでgdbプロセスに接続する必要があります。

gdb -p 8815

ここで以下を実行してくださいgdb

p close(1)

これにより、STDOUTファイル記述子が閉じます。次に、新しいアイテムを開きます。

p creat("/tmp/8815.out", 0600)

他の端末では、既に読み取りプロセスを設定できます。

tail -f /tmp/8815.out

gdb他の端末から切り離す必要があるため、まだ進行がありません。 +CtlまたはD:

q
Quit anyway? (y or n) 

y使用して確認してくださいEnter。これで、次の内容が表示されます(tailwhere run)。

173
174
175

既存のファイルまたはパイプを使用するには、次の手順に従ってくださいgdb

p open("/path/to/your/output", 1)

これはSTDOUTリダイレクトを示しています。数字が2であることを除いて、STDERRに似ています。


私は次の2つの答えを使用しました。

答え2

teeプログラムの起動時に利用可能です。 Bashを使用すると、次のことができます。

program > >(tee -a log.txt)

program代わりにstdoutを実行中のプロセスにリダイレクトしますtee。これは実際にはprogramtoの標準出力コピーを作成しますlog.txttee動作方法に応じて、以前に行った場所(おそらく端末)に標準出力を送信し続けますprogram

関連情報