出力をログファイルにリダイレクトし、同時にプロセスのバックグラウンドを設定できますか?
つまり、このようなことはできますか?
Nohup Java -jar myProgram.jar 2>&1 > output.log &
または、それは合法的なコマンドではありませんか?または、次のように手動で背景に移動する必要がありますか?
Java -jar myProgram.jar 2>$1 > output.log
jobs
[CTRL-Z]
bg 1
最初のコマンドの1つの問題は、stderrをstdoutがある場所にリダイレクトし(コメントで$を&に変更した場合)、次にstdoutをいくつかのログファイルにリダイレクトしたが、リダイレクトされたstderrに沿ってプルされない。逆の順序で行う必要があります。まず、stdoutを目的の場所に送信し、次にstderrをstdoutのアドレスに送信します。
some_cmd > some_file 2>&1 &
&をスローして、バックグラウンドに送信できます。ジョブにはjobs
コマンドを使用してアクセスできます。 jobs
は実行中のジョブを表示し、番号を付けます。次に、%の後にkill %1
などの数字を付けて、ジョブについて話すことができます。
また、最後に&がなければ、コマンドを一時停止できます Ctrlz、bg
コマンドを使用してバックグラウンドに配置し、fg
を使用してフォアグラウンドに戻します。 jobs
コマンドと組み合わせると、これは強力です。
コマンドを記述する順序について上記の部分を明確にするため。 stderrがアドレス1002、stdoutがアドレス1001、ファイルが1008であるとします。コマンドは左から右に読み取るため、最初に目にするのは2>&1
で、stderrをアドレス1001に移動し、次に> file
を参照してstdoutを移動します1008、ただしstderrを1001に維持します。1001を指すすべてをプルして1008に移動するのではなく、単にstdoutを参照してファイルに移動します。
逆に、それはstdoutを1008に移動し、次にstderrをstdoutが指しているポイントに移動します(1008も同様)。このようにして、両方が単一のファイルを指すことができます。
Java -jar myProgram.jar &> output.log &
&>
stdoutとstderrの両方をoutput.logに送信します
<Ctrl+Z>
で停止し、bg
でバックグラウンドで続行することは、コマンドの最後に&
を指定して実行することと同じです。
したがって、バックグラウンドで実行して出力をリダイレクトする場合:
Java -jar myProgram.jar 2> errorOutput.log > output.log &
端末を離れてもこのコマンドが終了しないようにする必要がある場合は、Nohup
を使用する必要があります
tee
コマンドもかなり普及しています。
Nohup Java -jar myProgram.jar | tee output.log &