Appassemblerを使用して作成されたJavaプロセスがあります。開始され、フォアグラウンドで実行されている限り、正常に実行されます。
[ec2-user@ip-xxx ourapp-0.0.1-SNAPSHOT]$ bin/ourapp
Starting in APP_HOME=/home/ec2-user/app_home
Press Q to quit
その後、アプリケーションに正常にアクセスしてテストできます。ただし、バックグラウンドで開始すると、実行が停止するだけでなく、フォアグラウンドに移動せずに復活させることはできません。
[ec2-user@ip-xxx ourapp-0.0.1-SNAPSHOT]$ bin/ourapp &
[1] 11661
Starting in APP_HOME=/home/ec2-user/app_home
Press Q to quit
## Not accessible!
[ec2-user@ip-xxx ourapp-0.0.1-SNAPSHOT]$ jobs
[1]+ Stopped bin/ourapp
[ec2-user@ip-xxx ourapp-0.0.1-SNAPSHOT]$ bg %1
[1]+ bin/ourapp & ## Still not accessible!
[ec2-user@ip-xxx ourapp-0.0.1-SNAPSHOT]$ jobs
[1]+ Stopped bin/ourapp
[ec2-user@ip-xxx ourapp-0.0.1-SNAPSHOT]$ fg %1
bin/ourapp ## Now, it's accessible.
私はそれを不適切に始めていますか?バックグラウンドであっても、ジョブを実行し続ける方法はありますか?これをデーモンプロセスとして開始しnohup
てからログアウトする必要がありますが、フォアグラウンドプロセスのままにしない限り、正常に実行し続けることができないようです。これは実行不可能です。
ほとんどの環境では、入力を待機しているバックグラウンドジョブが停止しているようです。
Unix Job ControlのWikipediaページから:
制御端末からの読み取りまたは制御端末への書き込みを試みるバックグラウンドプロセスには、SIGTTIN(入力用)またはSIGTTOU(出力用)信号が送信されます。これらのシグナルはデフォルトでプロセスを停止しますが、他の方法で処理することもできます。
そして、Unixの中間使用に関するRutgersページから:
バックグラウンドで実行されているジョブは、入力が必要な場合は停止します。バックグラウンドジョブに入力を与えることはできないため、必要なすべての入力が利用可能であることを確認してください。
解決策として、 Javaプロセスを更新して、入力を待つのではなく、メインスレッドを無期限にスリープさせるオプションの引数を受け入れるようにしました。SIGTERM/SIGINT
信号を適切に処理するシャットダウンフックがあります。
if (args.length >= 0 && StringUtils.equals(args[0], "daemon")) {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加