GNU/Linux >> Linux の 問題 >  >> Linux

すでに実行中のプロセスの出力をリダイレクトする方法

実行中のプロセスからの出力のリダイレクトを参照してください .

<ブロック引用>

まず、コマンド cat > foo1 を実行します 1 つのセッションで、stdin からのデータがファイルにコピーされることをテストします。次に、別のセッションで出力をリダイレクトします。

最初にプロセスの PID を見つけます:

$ ps aux | grep cat
rjc 6760 0.0 0.0 1580 376 pts/5 S+ 15:31 0:00 cat

開いているファイル ハンドルを確認します。

$ ls -l /proc/6760/fd
total 3
lrwx—— 1 rjc rjc 64 Feb 27 15:32 0 -> /dev/pts/5
l-wx—— 1 rjc rjc 64 Feb 27 15:32 1 -> /tmp/foo1
lrwx—— 1 rjc rjc 64 Feb 27 15:32 2 -> /dev/pts/5

GDB を実行します:

$ gdb -p 6760 /bin/cat
GNU gdb 6.4.90-debian

[license stuff snipped]

Attaching to program: /bin/cat, process 6760

[snip other stuff that's not interesting now]

(gdb) p close(1)
$1 = 0
(gdb) p creat("/tmp/foo3", 0600)
$2 = 1
(gdb) q
The program is running. Quit anyway (and detach it)? (y or n) y
Detaching from program: /bin/cat, process 6760

p GDB のコマンドは式の値を出力します。式は呼び出す関数にすることも、システム コールにすることもできます…だから close() を実行します。 システム コールを実行してファイル ハンドル 1 を渡し、creat() を実行します。 新しいファイルを開くためのシステムコール。 creat() の結果 これは、以前のファイル ハンドルを置き換えたことを意味します。 stdout と stderr に同じファイルを使用したい場合、またはファイル ハンドルを別の番号に置き換えたい場合は、dup2() を呼び出す必要があります。 その結果を達成するためのシステム コール。

この例では、 creat() を使用することにしました open() の代わりに パラメータが少ないからです。フラグ用の C マクロは GDB からは使用できません (C ヘッダーは使用されません)。そのため、これを発見するにはヘッダー ファイルを読み取る必要があります。それほど難しくはありませんが、時間がかかります。 0600 は、所有者が読み取り/書き込みアクセス権を持ち、グループなどはアクセス権を持たない 8 進数のパーミッションであることに注意してください。そのパラメータに 0 を使用し、後でファイルに対して chmod を実行することもできます。

その後、結果を確認します:

ls -l /proc/6760/fd/
total 3
lrwx—— 1 rjc rjc 64 2008-02-27 15:32 0 -> /dev/pts/5
l-wx—— 1 rjc rjc 64 2008-02-27 15:32 1 -> /tmp/foo3 <====
lrwx—— 1 rjc rjc 64 2008-02-27 15:32 2 -> /dev/pts/5

cat にさらにデータを入力する ファイル /tmp/foo3 になります に追加されています。

元のセッションを閉じたい場合は、セッションのすべてのファイル ハンドルを閉じ、制御 tty になる新しいデバイスを開き、setsid() を呼び出す必要があります。 .


reredirect を使用して行うこともできます (https://github.com/jerome-pouiller/reredirect/).

以下のコマンドは、プロセス PID の出力 (標準およびエラー) をリダイレクトします。 FILE へ :

reredirect -m FILE PID

README reredirect の プロセスの元の状態を復元する方法、別のコマンドにリダイレクトする方法、または stdout または stderr のみをリダイレクトする方法など、その他の興味深い機能についても説明しています。

このツールは relink も提供します 、出力を現在の端末にリダイレクトできるようにするスクリプト:

relink PID
relink PID | grep usefull_content

(reredirect 別の回答で説明されている Dupx と同じ機能を持っているようですが、Gdb には依存しません)。


Linux
  1. Linuxで出力をファイルとStdoutにリダイレクトする方法

  2. 実行中のプロセスの出力リダイレクトを変更するにはどうすればよいですか?

  3. 別のBashセッションで実行中のプロセスの出力を表示する方法は?

  1. Cpの実行の進行状況を確認する方法は?

  2. すでに実行中のプロセスが既存のファイルに書き込むのを防ぎますか?

  3. 出力をファイルと標準出力にリダイレクトする方法

  1. system() の出力をファイルにリダイレクトする方法は?

  2. spark-submit の出力全体をファイルにリダイレクトする方法

  3. プログラムの出力を入力としてリダイレクトする方法