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


116

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

言い換えれば、私はこのようなことをすることができますか?

nohup java -jar myProgram.jar 2>&1 > output.log &

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

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

2
試しましたか?どのようなエラーが発生しますか?また、コードにタイプミスやエラーがあるかどうかもわかりません。2>$1おそらくするはず2>&1です。
パトリック

回答:


171

最初のコマンドの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>&1stderrをアドレス1001に移動するのは最初に表示され、> filestdoutが1008に移動するのはただし、stderrは1001のままです。1001を指すすべてをプルして1008に移動するのではなく、単にstdoutを参照してファイルに移動します。
逆に、stdoutを1008に移動してから、stderrをstdoutが指しているポイント、1008にも移動します。この方法では、両方が単一のファイルを指すことができます。


で、このかかわらず、後にPIDを取り込むように見えることはできません$!
chovy

8
また、注目に値します&> file.out。stdinとstdoutの両方を出力ファイルにリダイレクトするために使用できます。これにより、2>&1コマンドラインの間違った場所に置くことによるミスの可能性を削減できます。
ダン

14

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

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

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

ターミナルを離れるときにこのコマンドが停止しないことも必要な場合は、使用する必要があります nohup


ああなるほど。追加された「&」文字は冗長であると言っていますか?
ジャンゴファン

マンページを引用します。とにかくnohupはバックグラウンドでコマンドを実行するため、バックグラウンドでnohup自体を実行するのは冗長のようです
-RSFalcon7

10
nohupはバックグラウンドでコマンドを実行しないため、明示的に追加する必要があります&
jlliagre

3
を使用してプロセスをバックグラウンドに移動した後、をbg実行してセッションから切り離すことができますdisown。これにより、ターミナルを閉じてもプロセスが停止しなくなります。
公園。

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

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


3
1行の説明で回答が完了します。
anaik

2
@ abhisheknaik96はjarファイルを実行し、stdinとstderrの両方をoutput.logにリダイレクトし、バックグラウンドプロセスにします。
Pパン

2

nohupを使用する代わりに、screenを使用できます。プログラムのステータスをリアルタイムで表示できます。すべての出力をファイルに記録することもできます。接続不良または非アクティブのためにログアウトするsshを介してサーバーにアクセスする場合に役立ちます。ログインした後、作業を​​続行できます。参照してください。このこれを詳細に知ることが。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.