回答:
最初のコマンドの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にも移動します。この方法では、両方が単一のファイルを指すことができます。
$!
&> file.out
。stdinとstdoutの両方を出力ファイルにリダイレクトするために使用できます。これにより、2>&1
コマンドラインの間違った場所に置くことによるミスの可能性を削減できます。
で停止し<Ctrl+Z>
、バックグラウンドで続行することは、コマンドの最後でbg
withを実行することと同等&
です。
したがって、バックグラウンドで実行し、出力をリダイレクトするには:
java -jar myProgram.jar 2> errorOutput.log > output.log &
ターミナルを離れるときにこのコマンドが停止しないことも必要な場合は、使用する必要があります nohup
&
bg
実行してセッションから切り離すことができますdisown
。これにより、ターミナルを閉じてもプロセスが停止しなくなります。
tee
コマンドはあまりにもかなり普及しています。
nohup java -jar myProgram.jar | tee output.log &
2>$1
おそらくするはず2>&1
です。