出力をログファイルにリダイレクトしながら、プロセスをバックグラウンドにすることはできますか?

出力をログファイルにリダイレクトしながら、プロセスをバックグラウンドにすることはできますか?

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

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

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

それともこれは法的命令ではありませんか?または、次のように手動で背景に移動する必要がありますか?

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

答え1

最初のコマンドの問題の1つは、stderrをstdoutのある場所にリダイレクトしてから(説明で提案されているように$を&に変更した場合)、stdoutをいくつかのログファイルにリダイレクトしますが、リダイレクトされたstderrをインポートしないことです。別の順序でこれを行う必要があります。まず、stdoutを目的の場所に送信してから、stdoutのあるアドレスにstderrを送信します。

some_cmd > some_file 2>&1 &

その後、& を追加して背景に送信できます。コマンドを使用してジョブにアクセスできますjobsjobs実行中のジョブが表示され、番号が付けられます。その後、%の後に同様の数字を使用して仕事について話すことができます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に移動します。これにより、両方とも単一のファイルを指すことができます。

答え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を介してサーバーに接続し、接続が悪い場合やアクティビティがないためにログアウトする場合に便利です。ログインしたら、中断した部分から作業を続けることができます。引用するこれそしてこれもっと学ぶ。

関連情報