web-dev-qa-db-ja.com

出力をログファイルにリダイレクトし、同時にプロセスのバックグラウンドを設定できますか?

出力をログファイルにリダイレクトし、同時にプロセスのバックグラウンドを設定できますか?

つまり、このようなことはできますか?

Nohup Java -jar myProgram.jar 2>&1 > output.log &

または、それは合法的なコマンドではありませんか?または、次のように手動で背景に移動する必要がありますか?

Java -jar myProgram.jar 2>$1 > output.log
jobs
[CTRL-Z]
bg 1
134
djangofan

最初のコマンドの1つの問題は、stderrをstdoutがある場所にリダイレクトし(コメントで$を&に変更した場合)、次にstdoutをいくつかのログファイルにリダイレクトしたが、リダイレクトされたstderrに沿ってプルされない。逆の順序で行う必要があります。まず、stdoutを目的の場所に送信し、次にstderrをstdoutのアドレスに送信します。

some_cmd > some_file 2>&1 &

&をスローして、バックグラウンドに送信できます。ジョブにはjobsコマンドを使用してアクセスできます。 jobsは実行中のジョブを表示し、番号を付けます。次に、%の後にkill %1などの数字を付けて、ジョブについて話すことができます。

また、最後に&がなければ、コマンドを一時停止できます Ctrlzbgコマンドを使用してバックグラウンドに配置し、fgを使用してフォアグラウンドに戻します。 jobsコマンドと組み合わせると、これは強力です。

コマンドを記述する順序について上記の部分を明確にするため。 stderrがアドレス1002、stdoutがアドレス1001、ファイルが1008であるとします。コマンドは左から右に読み取るため、最初に目にするのは2>&1で、stderrをアドレス1001に移動し、次に> fileを参照してstdoutを移動します1008、ただしstderrを1001に維持します。1001を指すすべてをプルして1008に移動するのではなく、単にstdoutを参照してファイルに移動します。
逆に、それはstdoutを1008に移動し、次にstderrをstdoutが指しているポイントに移動します(1008も同様)。このようにして、両方が単一のファイルを指すことができます。

192
Jacob Minshall
Java -jar myProgram.jar &> output.log &

&> stdoutとstderrの両方をoutput.logに送信します

20
Abhinav Bhatia

<Ctrl+Z>で停止し、bgでバックグラウンドで続行することは、コマンドの最後に&を指定して実行することと同じです。

したがって、バックグラウンドで実行して出力をリダイレクトする場合:

Java -jar myProgram.jar 2> errorOutput.log > output.log &

端末を離れてもこのコマンドが終了しないようにする必要がある場合は、Nohupを使用する必要があります

15
RSFalcon7

teeコマンドもかなり普及しています。

Nohup Java -jar myProgram.jar | tee output.log &

2
trevorgrayson

Nohupを使用する代わりに、画面を使用できます。プログラムのステータスをリアルタイムで表示できます。すべての出力をファイルに記録することもできます。これは、sshを介してサーバーにアクセスする場合に役立ちます。接続が不十分であるか非アクティブであるためにログアウトした場合に役立ちます。ログイン後、あなたはあなたが去ったところから作業を続けることができます。詳細は this および this を参照してください。

2
Mani