nohupを使用してstdoutをファイルにリダイレクトすると機能しません。

nohupを使用してstdoutをファイルにリダイレクトすると機能しません。

バックグラウンドでCプログラムを実行しようとしています。また、プログラムの標準出力を保存したいと思います。

ただし、nohupは、次のことを試みた場合にのみ、stderr出力をlogfile.txtにリダイレクトします。

nohup ./GetTempValues 11 4 > logfile.txt 2>&1 &

ここで、11と4は私のプログラムに渡す必要があるパラメータ、最後のパラメータはバックグラウンドで&プログラムを実行するために使用されるパラメータです(GetTempValuesは私のプログラムです)。

答え1

GetTempValuesもともと標準出力が生成されると確信していますか?あなたの構文が「私に適している」からです。

$ nohup perl test.pl >logfile.txt 2>&1 &
[1] 20964
$ cat logfile.txt 
this goes to stderr
this goes to stdout
[1]+  Done                    nohup perl test.pl > logfile.txt 2>&1

test.plどこ

print STDOUT "this goes to stdout\n";
print STDERR "this goes to stderr\n";

PS:あなたの例では、2>&1STDERRをSTDOUTにリダイレクトする必要はありません。nohup「標準エラーが端末の場合は、標準出力と同じ場所に渡されます。」nohupマニュアルページ)。

答え2

ギドが上で指摘したように、北面標準エラーは、ファイルにリダイレクトしない限り、すでにリダイレクトされています。 Linuxを使用している場合は、nohupで単純なコマンドを実行して以前のdup2(2)呼び出しを確認するのが役立ちますexecve(2)

私はあなたが見るものがあなたが見ると思うものだと思う。あなたが言ったら何が起こるのか考えてみましょう。

nohup foo 2>&1
  1. シェルはstderrをstdoutにリダイレクトします。
  2. その後呼び出されます。北面、これはこの状況を継承します(stderrとstdoutは同じファイル記述子を使用します)。
  3. 北面(ファイル記述子3)を開き、nohup.outファイル記述子1にコピーして3を閉じます。
  4. 北面stderrはファイルではなく、ファイル記述子1〜2もコピーされます。したがって、ファイル記述子1と2の両方が参照されますnohup.out
  5. 北面execコマンドラインで指定された引数を使用して呼び出されます(この場合金持ち)。新しいプロセスはファイル記述子を継承します。北面そのために設定します。

おっしゃったように、コマンドラインではケースを作成できません。nohupはstderr出力のみをリダイレクトします。北面常に stdout と stderr をファイルに書き込みます。 stdoutは、リダイレクトで指定したファイルに移動しますnohup.out。 stderr は、明示的に別のファイルにリダイレクトしない限り、stdout に従います。

2>&1一緒に使う特別な側面北面GNUバージョンはstderrに意味のないメッセージを生成します。nohup:入力を無視し、「nohup.out」に出力を追加します。。 (他のユーティリティは、次のメッセージを標準エラーに書き込みます。文書の指示に従ってください。?) 通常、ノイズはリダイレクト時に端末に書き込まれ、出力ファイルの最初の行で終わります。

関連情報