私はシステムエンジニアではありません(ソフトウェア開発者です)。Javaアプリケーション(実行可能な.jarLinuxマシン(Centos 7)でファイルを作成しています。SSH経由でシェルに接続しています。このアプリケーションは瓶バッチ アプリケーションをフォーマットして実装し、それ自体にスケジューラが含まれています。
シェルを終了した後も引き続き実行されるようにするには、リモート サーバー上でバックグラウンドで実行する必要があります。
アプリケーションをバックグラウンドで実行するために、次のコマンドを実行しました。
java -Xms256m -Xmx1024m -jar UpdateInfoBatch-0.0.1-SNAPSHOT.jar &
それから私はクリックしましたCtrl+C キーシェルのキーボード プロンプトを再度取得するには、キーボードで次のように入力します。
ここで最初の奇妙な動作が起こります。シェル プロンプトが再び表示され、コマンドを挿入できるようになりますが、アプリケーションが何かをログに記録すると、それがシェルに表示されます。なぜでしょうか。アプリケーションがバックグラウンドで引き続き実行されると予想していました。
とにかく、アプリケーションが実行されているかどうかを確認するために、シェルで次のコマンドを実行します。
[email protected] [~/zzz-import-data-batch]# ps aux | grep java
xxx 23307 15.3 1.6 4871172 418980 pts/0 Sl 10:23 0:22 java -Xms256m -Xmx1024m -jar UpdateInfoBatch-0.0.1-SNAPSHOT.jar
webadmin 23522 0.0 0.0 112812 980 pts/0 S+ 10:25 0:00 grep --color=auto java
はい、私のアプリケーションは正常に実行されているようです (最初のもの)。
次に、シェルへの接続を閉じ、再度ログインして、前のコマンドを再度実行しますが、次のような結果になります。
[email protected] [~/zzz-import-data-batch]# ps aux | grep java
xxx 23919 0.0 0.0 112812 980 pts/0 S+ 10:27 0:00 grep --color=auto java
ご覧のとおり、その後シェルから切断し、新しいログインを行うと、バッチ アプリケーションが実行されていないように見えます (実際、ジョブ アプリケーションは実行されていません)。
何が間違っているのでしょうか? 何が足りないのでしょうか? Java jar バッチ アプリケーションをバックグラウンドで実行する良い方法は何でしょうか?
答え1
シェルを終了する前に、バックグラウンド ジョブとシェルの関連付けを解除する必要があります。
を入力するとcommand &
、システムによって「[1] 25177」のようなジョブ ID が付与されます。ここで、 は1
ジョブ ID です。
今すぐ使うべきなのは 否認コマンド上記の例では、次のようになります。
disown 1
または、すべてのジョブを実行します (ジョブは 1 つしかないため)。
disown
詳細については、例えば以下を参照してください。 Linux / Unix: disown コマンド。