![出力をログ ファイルにリダイレクトし、同時にプロセスをバックグラウンドで実行できますか?](https://rvso.com/image/31666/%E5%87%BA%E5%8A%9B%E3%82%92%E3%83%AD%E3%82%B0%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88%E3%81%97%E3%80%81%E5%90%8C%E6%99%82%E3%81%AB%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%82%92%E3%83%90%E3%83%83%E3%82%AF%E3%82%B0%E3%83%A9%E3%82%A6%E3%83%B3%E3%83%89%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%8B%3F.png)
出力をログ ファイルとバックグラウンド プロセスに同時にリダイレクトできますか?
つまり、こんなことができるのでしょうか?
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 に移動します。このようにして、両方が単一のファイルを指すことができます。
答え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