異なる点の標準出力を表示[冗長]

異なる点の標準出力を表示[冗長]

状況はこんな感じです。コンピュータを家に置いて、ある2TBハードドライブから別の2TBハードドライブに再同期しました(どちらもUSB 2.0なので時間がかかります)。私は今職場にいて、SSH経由で自宅のコンピュータに接続しました。これにより、ps aux | grep rsync次のことがわかります。

1000  7214 18.8  0.1  30636  1368 pts/0 S+   00:52 134:00 rsync -vr /media/master /media/slave

しかし、私はrsyncが実際に何をしているのか見たかったです。自宅にいるときに標準出力が端末に表示され、rsyncの詳細モードは現在コピーされているファイルを示します。異なるポイントの標準出力を読み取る方法はありますか?

$ ps -t pts/0
7214 pts/0    02:14:42 rsync

Googleを試してみると/proc/pid/fd答えがあるようですが、よくわかりません...

PS:もちろん、sudo権限があります。

答え1

実行しgdb -p 7214、次の操作を行います。

p dup2(open("/dev/pts/your-pts-number", 1), 1)
detach
quit

完全には明確ではありませんが、接続されたプロセスの標準出力を最初の行に指定されたパス(この場合は目的のポイント)にリダイレクトします。

答え2

これストレスこのツールを使用すると、特定のファイル記述子(この場合はstdoutとstderr)に送信された出力のコピーを取得できます。

strace -e write=1,2 -e trace=write -p 7214

これは16進ダンプ形式で表示されます。

答え3

rsync端末からプロセスを切り離して現在の端末に移動できます。バラより実行中のプロセスであることを拒否し、新しいスクリーンシェルに接続するにはどうすればよいですか?。基本的なアプローチは次のとおりです。John Flatnessの答えのgdbコマンドしかし、次のようなニールズそしてレティさらに頑丈になりました。

プロセスを画面またはtmuxセッションにインポートして再度分離する必要がないようにしてください(すでにこの機能を提供するneercsを使用していない限り)。

もう一つの方法は、開いているファイルを見て、プロセスが今何をしているのかを確認することです。lsofあなたに言うでしょう。

lsof -p7214

答え4

BSDチェックインwatch注文する。

それ以外の場合は、次の例を確認してくださいstrace7214PIDはどこにあります)。

strace -e trace=write -s1000 -fp 7214 2>&1 \
| grep --line-buffered -o '".\+[^"]"' \
| grep --line-buffered -o '[^"]\+[^"]' \
| while read -r line; do
  printf "%b" $line;
done

詳細な説明や例については、以下を確認してください。別のbashセッションで実行されているプロセスの出力をどのように表示できますか?

関連情報