134

標準の仮想ホスト Linux ソリューションで実行される Java サーバー アプリケーションを作成しました。アプリケーションは常に実行され、ソケット接続をリッスンし、それらの新しいハンドラーを作成します。これは、クライアント サーバー アプリケーションへのサーバー側の実装です。

私がそれを開始する方法は、サーバーの起動rc.localスクリプトに含めることです。ただし、開始すると停止するためにアクセスする方法がわからず、更新をインストールする場合は、アプリケーションを再起動するためにサーバーを再起動する必要があります。

Windows PC では、このタイプのアプリケーション用に Windows サービスを作成し、必要に応じて停止および開始することができます。このアプリケーションを起動すると、サーバーを完全に再起動しなくても停止して再起動できるように、Linuxボックスにそのようなものはありますか?

私のアプリケーションは WebServer.exe と呼ばれます。サーバーの起動時に、次のようにrc.localに含めることで開始されます。

java -jar /var/www/vhosts/myweb.com/phpserv/WebServer.jar &

私は Linux の初心者なので、どのような投稿でも例を挙げていただければ幸いです。ただし、SSH とボックスへの完全な FTP アクセスがあり、アップデートをインストールしたり、Plesk パネルにアクセスしたりできます。

4

16 に答える 16

243

ここに別の簡単なラッパーを書きました:

#!/bin/sh
SERVICE_NAME=MyService
PATH_TO_JAR=/usr/local/MyProject/MyJar.jar
PID_PATH_NAME=/tmp/MyService-pid
case $1 in
    start)
        echo "Starting $SERVICE_NAME ..."
        if [ ! -f $PID_PATH_NAME ]; then
            nohup java -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null &
            echo $! > $PID_PATH_NAME
            echo "$SERVICE_NAME started ..."
        else
            echo "$SERVICE_NAME is already running ..."
        fi
    ;;
    stop)
        if [ -f $PID_PATH_NAME ]; then
            PID=$(cat $PID_PATH_NAME);
            echo "$SERVICE_NAME stoping ..."
            kill $PID;
            echo "$SERVICE_NAME stopped ..."
            rm $PID_PATH_NAME
        else
            echo "$SERVICE_NAME is not running ..."
        fi
    ;;
    restart)
        if [ -f $PID_PATH_NAME ]; then
            PID=$(cat $PID_PATH_NAME);
            echo "$SERVICE_NAME stopping ...";
            kill $PID;
            echo "$SERVICE_NAME stopped ...";
            rm $PID_PATH_NAME
            echo "$SERVICE_NAME starting ..."
            nohup java -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null &
            echo $! > $PID_PATH_NAME
            echo "$SERVICE_NAME started ..."
        else
            echo "$SERVICE_NAME is not running ..."
        fi
    ;;
esac 

ここでinit.dの完全なチュートリアルに従うことができ、ここでsystemd(ubuntu 16+)の完全なチュートリアルに従うことができます

出力ログが必要な場合は、2

nohup java -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null &

の行

nohup java -jar $PATH_TO_JAR >> myService.out 2>&1&
于 2014-01-22T12:53:49.893 に答える
50

簡単な解決策は、nohupを介してJavaを実行し、PIDをファイルに保存するスクリプトstart.shを作成することです。

nohup java -jar myapplication.jar > log.txt 2> errors.txt < /dev/null &
PID=$!
echo $PID > pid.txt

次に、停止スクリプトstop.shがファイルからPIDを読み取り、アプリケーションを強制終了します。

PID=$(cat pid.txt)
kill $PID

もちろん、プロセスが存在するかどうかを確認したり、完了しpid.txtたら削除したりするなど、いくつかの詳細は省略しました。

于 2012-06-26T08:41:43.670 に答える
34

Linuxサービスの初期化スクリプトはに保存され/etc/init.dます。/etc/init.d/skeletonファイルをコピーしてカスタマイズしてから、

service [yourservice] start|stop|restart

http://www.ralfebert.de/blog/java/debian_daemon/を参照してください。Debian用ですが(Ubuntuも同様)、より多くのディストリビューションに適合します。

于 2012-06-26T08:41:25.907 に答える
14

おそらく最良の dev-ops ソリューションではありませんが、LAN パーティーなどのサーバーの一般的な使用には適しています。

screenサーバーを実行し、ログアウトする前にデタッチするために使用します。これにより、プロセスが実行されたままになり、いつでも再アタッチできます。

ワークフロー:

画面を開始します。screen

サーバーを起動します。java -jar minecraft-server.jar

を押して取り外します: Ctl-a,d

再接続:screen -r

詳細はこちら: https://www.gnu.org/software/screen/manual/screen.html

于 2015-06-13T21:21:16.970 に答える
7

もう1つの選択肢は、非常に人気があり、JavaServiceWrapperです。これは、OSSコミュニティでも非常に人気があります。

于 2012-06-26T08:40:23.880 に答える
4

最も簡単な方法は、 を使用することsupervisordです。詳細については、 http : //supervisord.org/ をご覧ください。

より詳しい情報:

https://askubuntu.com/questions/779830/running-an-executable-jar-file-when-the-system-starts/852485#852485

https://www.digitalocean.com/community/tutorials/how-to-install-and-manage-supervisor-on-ubuntu-and-debian-vps

于 2016-11-22T23:38:39.527 に答える
3

Spring Boot application as a Serviceからは、Python ベースのsupervisordアプリケーションをお勧めできます。詳細については、そのスタック オーバーフローの質問を参照してください。セットアップは本当に簡単です。

于 2015-01-06T10:23:51.360 に答える
1

Thrift サーバーまたはJMXを使用して、Java サービスと通信できます。

于 2012-06-26T09:35:55.400 に答える
0

しかし、一度始めたら、それを止めるためにそれにアクセスする方法がわかりません

Javaプロセスを取得し、PIDを抽出して、killを呼び出す単純な停止スクリプトを作成できます。派手ではありませんが、簡単です。そのような何かが出発点として役立つかもしれません:

#!/bin/bash
PID = ps ax | grep "name of your app" | cut -d ' ' -f 1
kill $PID
于 2012-06-26T08:41:07.430 に答える