バックグラウンドで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>&1
STDERRをSTDOUTにリダイレクトする必要はありません。nohup
「標準エラーが端末の場合は、標準出力と同じ場所に渡されます。」(nohup
マニュアルページ)。
答え2
ギドが上で指摘したように、北面標準エラーは、ファイルにリダイレクトしない限り、すでにリダイレクトされています。 Linuxを使用している場合は、nohupで単純なコマンドを実行して以前のdup2(2)
呼び出しを確認するのが役立ちますexecve(2)
。
私はあなたが見るものがあなたが見ると思うものだと思う。あなたが言ったら何が起こるのか考えてみましょう。
nohup foo 2>&1
- シェルはstderrをstdoutにリダイレクトします。
- その後呼び出されます。北面、これはこの状況を継承します(stderrとstdoutは同じファイル記述子を使用します)。
- 北面(ファイル記述子3)を開き、
nohup.out
ファイル記述子1にコピーして3を閉じます。 - 北面stderrはファイルではなく、ファイル記述子1〜2もコピーされます。したがって、ファイル記述子1と2の両方が参照されます
nohup.out
。 - 北面
exec
コマンドラインで指定された引数を使用して呼び出されます(この場合金持ち)。新しいプロセスはファイル記述子を継承します。北面そのために設定します。
おっしゃったように、コマンドラインではケースを作成できません。nohupはstderr出力のみをリダイレクトします。。 北面常に stdout と stderr をファイルに書き込みます。 stdoutは、リダイレクトで指定したファイルに移動しますnohup.out
。 stderr は、明示的に別のファイルにリダイレクトしない限り、stdout に従います。
2>&1
一緒に使う特別な側面北面GNUバージョンはstderrに意味のないメッセージを生成します。nohup:入力を無視し、「nohup.out」に出力を追加します。。 (他のユーティリティは、次のメッセージを標準エラーに書き込みます。文書の指示に従ってください。?) 通常、ノイズはリダイレクト時に端末に書き込まれ、出力ファイルの最初の行で終わります。