プロセス出力がリダイレクトされる位置の確認

プロセス出力がリダイレクトされる位置の確認

出力をoutput.txtにリダイレクトする必要があるプロセスがあります。残念ながら、出力はファイルに転送されません。まず、別のディレクトリから呼び出されたことを確認しましたが、出力が行く場所以外にはoutput.txtはありません。そこで、出力を確認したsudo tail -f /proc/2027/fd/1結果、プロセスが正しく実行されており、有効な出力があることを確認しました。また、プロセスがすでに動作していて何も変更していないため、プロセスを正しく起動していると確信しています。今私の質問は、このプロセスの出力がどこに行くのかということです。次の出力を表示するソリューションのみを見つけることができます。別のbashセッションで実行されているプロセスの出力をどのように表示できますか?。しかし、出力がどこにリダイレクトされるのかを確認したいと思います。完全性のためにJavaでプロセスを開始する方法は次のとおりです。

ProcessBuilder builder = new ProcessBuilder("java", "-jar", "variobox.jar");
builder.redirectOutput(new File("out.txt"));
builder.redirectError(new File ("error.txt"));
builder.start();

答え1

ご覧のとおり、/proc/$pid/fd/1stdoutに送信された出力が表示されます。しかし見てくださいこれから標準出力が送信されているので、シンボリックリンクの宛先だけを見ることができます。

$ sleep 20 & pid=$!
[1] 88972
$ readlink -f /proc/$pid/fd/1
/dev/pty0
$  sleep 20 > /dev/null & pid=$!
[1] 99996
readlink -f /proc/$pid/fd/1
/dev/null

リンクの宛先がパイプで、もう一方の端に何があるかを見つけるには、次を参照してください。Unixパイプの反対側のプロセス名は何ですか?。リンクのターゲットがソケットで、もう一方の端に何があるかを見つけるには、次を参照してください。このUnixソケットペアの反対側の端を持っている人はいますか?

ただし、表示される出力がファイルに送信される出力でない場合、表示さoutput.txtれる出力は次のようになります。いいえ実際に出力されます(またはより具体的には標準出力ではありません)。それはおそらくファイルディスクリプタである標準エラーです2

答え2

移植可能には、次のものを使用できます。

lsof -ad 1 -p "$pid"

idプロセスのfd 1(stdout)に何が開いているかを確認します$pid

パイプや他のプロセス間通信チャネルで開いている場合、Linuxは-E反対側のプロセスを表示するオプションを追加できます。

関連情報