サーバーでjava jarファイルをバックグラウンドプロセスとして実行する


105

2つのアプリケーション間で通信するために、サーバーでJava jarを実行する必要があります。それを実行するために2つのシェルスクリプトを作成しましたが、そのスクリプトを起動すると、プロセスをシャットダウン/終了できません。ctrl+ を押すCか、コンソールを閉じると、サーバーがシャットダウンします。このスクリプトを変更して通常のサーバーとして実行する方法を誰かが手伝ってくれる?

 #!/bin/sh
java -jar /web/server.jar
echo $! 
#> startupApp.pid

回答:


242

あなたはこれを試すことができます:

#!/bin/sh
nohup java -jar /web/server.jar &

&記号は、プログラムをバックグラウンドで実行するように切り替えます。

nohupユーティリティは、ログアウトした後でも、引数として渡されたコマンドをバックグラウンドで実行します。


Antonに感謝します。現在、プロセスidを強制終了してサーバーを停止しています。サーバーを停止するコマンドは、ベストプラクティスではないと思います。
Bernad Ali

3
短い答え:サーバーによって異なります。長い答え:私の知る限り、プロセスがこのような適切なシャットダウンをサポートしない限り、プロセスをシャットダウンする安全な方法はありません。たとえば、外部信号によって終了しているWebサーバーの場合、常に一部の要求が失われる可能性があります。この問題を解決する1つの方法は、たとえば特別な種類の要求を処理するなどして、サーバー自体に適切な終了機能を実装することです。次に、その特別な種類の要求を送信することにより、サーバーを終了できます。それ以外の場合は、IDでプロセスを強制終了するのが簡単な方法です。
アントンベログラゾフ2012

1
の使用nohupは、常にstdoutとstderrを明示的にリダイレクトすることと組み合わせる必要があります。そうしないと、ログの保存場所を制御できず、nohup.outこのスクリプトが呼び出されたディレクトリに醜いものが作成されてしまいます。
Charles Duffy

@Antonは、SSH EXEC runjar.shを使用して(答えと同じように)スクリプトを実行すると ローカルターミナルでログのストリーミングを開始し、ターミナルを閉じるとjarが終了します。SSH EXECを使用してバックグラウンドでjarを実行するにはどうすればよいですか?
AATHITH RAJENDRAN

47

現在、ほとんどのディストリビューションで実行されているSystemd

ステップ1:

自分のユーザー定義サービスを見つけました /usr/lib/systemd/system/

ステップ2:

お気に入りのテキストエディターという名前のテキストファイルを作成します。 whatever_you_want.service

ステップ3:

次のテンプレートをファイルに入れ ますwhatever_you_want.service

[Unit]
Description=webserver Daemon

[Service]
ExecStart=/usr/bin/java -jar /web/server.jar
User=user

[Install]
WantedBy=multi-user.target

ステップ4:

スーパーユーザーとしてサービス実行する

$ systemctl start whatever_you_want.service # starts the service
$ systemctl enable whatever_you_want.service # auto starts the service
$ systemctl disable whatever_you_want.service # stops autostart
$ systemctl stop whatever_you_want.service # stops the service
$ systemctl restart whatever_you_want.service # restarts the service

これが最新の方法です
EarthMind

4
aws ubutnuイメージにsystemdをインストールする必要があり、そのイメージを/ etc / systemd / system /に見つけました
Robbo_UK

29

Ubuntuを使用していて、 "Upstart"(http://upstart.ubuntu.com/)がある場合、これを試すことができます。

作成する /var/init/yourservice.conf

次の内容で

description "Your Java Service"  
author "You"  

start on runlevel [3]  
stop on shutdown  

expect fork  

script     
    cd /web 
    java -jar server.jar >/var/log/yourservice.log 2>&1  
    emit yourservice_running  
end script  

これで、service yourservice startおよびservice yourservice stopコマンドを発行できます。あなたは/var/log/yourservice.logそれが機能していることを確認するために尾を引くことができます。

コンソールウィンドウを占有することなく、コンソールからjarを実行したいだけの場合は、次のようにします。

java -jar /web/server.jar > /var/log/yourservice.log 2>&1

3
これはsystemdサービスですか?この質問にはlinuxのタグは付いていません。デフォルトでsystemdを使用しているディストリビューションはほとんどありません。
ヨルダン2012

1
これは、ubuntuに含まれている「upstart」を使用しているという質問を修正します。
Strelok、2012

1
あなたはそれを解放しまった背景と、シェルで実行したい場合、私は、最後のアドバイスを信じて、あなたが実行する必要があります java -jar /web/server.jar > /var/log/yourservice.log 2>&1 &
とMontaro

デフォルトでは、すべてのシステムジョブは次のディレクトリにあります。/ etc / init / ...デフォルトでは、Ubuntu 14.04には/ var / init /ディレクトリはありません。
マイケルラファイエット

また、サービスを開始するには「sudo」が必要です。sudo service yourservice start
Michael Lafayette

2

バックグラウンドで実行し、以下を使用してログファイルにログを追加します。

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