バックグラウンド ジョブの stdout/stderr をコンソールからログ ファイルにリダイレクトしますか?

バックグラウンド ジョブの stdout/stderr をコンソールからログ ファイルにリダイレクトしますか?

ジョブを実行するだけです (foo.sh を想定)。

./foo.sh
[Press Ctrl-Z to stop]
bg  # enter background

そして、stdout と stderr に出力を生成します。現在の画面ではなく、他のファイルに stdout と stderr をリダイレクトする方法はありますか?

答え1

どうやら最初にあなたの質問を読み間違えたようですので、更新した回答は次のとおりです:

プログラムをバックグラウンドに送った後、まずそのPIDを見つける必要があります。

pgrep foo.sh

gdb次に、そのプロセスにアタッチするために使用できます

gdb -p <PID>

次にgdb、このプログラムが書き込む場所を変更します

p dup2(open("/path/to/file",577, 420), 1)
p dup2(1, 2)

その後、プロセスから切り離して終了しますgdb

detach
quit

ちょっとした説明

  • 577は以下と同等であるO_CREAT|O_WRONLY|O_TRUNC
  • 420は以下と同等であるS_IRUSR|S_IWUSR|S_IRGRP|S_IROTH
  • したがって、呼び出しはopenファイルを開き、存在する場合は0バイトに切り捨て、存在しない場合は適切なファイル権限で新しいファイルを作成します。
  • 最初の の呼び出しは、dup2の呼び出しによって返されたファイル記述子をopenファイル記述子1stdout)に複製します。
  • 2回目の呼び出しでは、dup2ファイル記述子を()1に複製します。2stderr

関連情報