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

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

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

つまり、こんなことができるのでしょうか?

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 &

そして、& をオンにしてバックグラウンドに送ることができます。ジョブには、コマンドでアクセスできますjobsjobs実行中のジョブが表示され、番号が付けられます。その後、% の後に番号を付けて、またはのようにジョブについて話すことができますkill %1

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

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

答え2

java -jar myProgram.jar &> output.log &

&>stdoutとstderrの両方をoutput.logに送ることに注意してください。

答え3

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

したがって、バックグラウンドで実行し、出力をリダイレクトするには、次のようにします。

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

ターミナルを終了してもこのコマンドが終了しないようにする必要がある場合は、次のようにします。nohup

答え4

nohup の代わりに screen を使うことができます。プログラムの状態をリアルタイムで表示できます。すべての出力をファイルに記録することもできます。接続不良や非アクティブ状態が原因でログアウトされたときに、ssh 経由でサーバーにアクセスするときに便利です。ログイン後、中断したところから作業を続行できます。これそしてこれ詳細を知る。

関連情報