web-dev-qa-db-ja.com

別のポイントの標準出力を表示

これが状況です。私は2TBのハードドライブから別の2TBのハードドライブへのrsyncを実行しているPCを自宅に置いたままにしました(どちらもUSB 2.0であるため、しばらく時間がかかります)。私は今仕事をしていて、自宅のPCにssh-edしています。私が行った場合 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

私は少しググリングをしました、そしてそれは/proc/pid/fdは答えを持っているかもしれませんが、これについてはよくわかりません...

追伸もちろん、Sudo権限があります。

22
mulllhausen

gdb -p 7214を実行して、次のようにします。

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

これは明確ではありませんが、アタッチしたプロセスのstdoutを最初の行で指定したパス(この場合は目的のpts)にリダイレクトします。

19
John Flatness

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

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

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

9
Random832

rsyncプロセスをターミナルから切り離して、現在のプロセスに移動できます。 実行中のプロセスを否認して新しい画面シェルに関連付けるにはどうすればよいですか? を参照してください。基本的なアプローチは John Flatnessの回答のgdbコマンド に似ていますが、 neercsretty などのツールの方が堅牢です。

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

別のアプローチは、プロセスが開いているファイルを確認することにより、プロセスが現在何をしているかを確認することです。 lsof と表示されます。

lsof -p7214

事前にこれを行いたいことがわかっている場合...

ホームコンピューターでスクリプトセッションを作成します(-fを使用してバッファーをフラッシュします)。

script -f output.txt
rsync -vr /media/master /media/slave

Ctrl+D 帰宅したらスクリプトセッションを終了します)

職場では、output.txtを追跡できます。

tail -f output.txt
1
Wayne

BSDでは watch コマンドを確認してください。

それ以外の場合は、straceを使用して次の例を確認してください(ここで7214はPIDです):

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セッションで実行中のプロセスの出力を表示する方法

0
kenorb