web-dev-qa-db-ja.com

Linuxのバックグラウンドプロセス

私はJava正常に動作しているソケットサーバー接続を開発しました。

端末から起動すると、クライアントからのリッスンから起動します。しかし、端末を閉じると、リスニングが停止します。

Jarファイルが開始された場所からユーザーが端末を閉じても、続行する必要があります。

LinuxでバックグラウンドプロセスとしてJavaサーバーソケットアプリケーションを実行するにはどうすればよいですか?

23
user861973

そのようなことを実現する方法はいくつかあります。

  1. Nohup Java -server myApplication.jar > /log.txt-これは非常に簡単です。アプリケーションをバックグラウンドに置くだけです。これは機能しますが、そうするのにあまり良い方法ではありません。
  2. シェルラッパーと上記のOR daemon app。を使用します。このアプローチは多くのオープンソースプロジェクトで使用されており、ほとんどのシナリオに適しています。 init.dに含まれており、定期的な開始、停止、およびステータスコマンドで必要な実行レベル必要に応じて例を提供できます。
  3. Java Service Wrapper または Apache Jakarta Commons Daemon を使用して、独自のデーモンサーバーを構築します。繰り返しますが、どちらも非常に人気があり、十分にテストされ、信頼性があります。そして、LinuxとWindowsの両方で利用可能です! Apache CommonsのものがTomcatサーバーによって使用されます!さらに、 Akuma があります。

個人的には、将来このサーバーを使用したり、クライアントやエンドユーザーなどに配布したりする必要がある場合は、ソリューション2または3を使用します。何かを実行する必要があり、時間がない場合は、Nohup問題に対するより複雑なソリューションを開発する。

広告2:

多くのプロジェクトで使用されている最高のスクリプトは、 here にあります。

Debian/Ubuntuの場合、start-stop-daemonに基づいた非常に単純なスクリプトを使用できます。疑わしい場合は、/etc/init.d/skeletonを変更できます。

#!/bin/sh

DESC="Description"
NAME=YOUR_NAME
PIDFILE=/var/run/$NAME.pid
RUN_AS=USER_TO_RUN
COMMAND=/usr/bin/Java -- -jar YOUR_JAR

d_start() {
    start-stop-daemon --start --quiet --background --make-pidfile --pidfile $PIDFILE --chuid $RUN_AS --exec $COMMAND
}

d_stop() {
    start-stop-daemon --stop --quiet --pidfile $PIDFILE
    if [ -e $PIDFILE ]
        then rm $PIDFILE
    fi
}

case $1 in
    start)
    echo -n "Starting $DESC: $NAME"
    d_start
    echo "."
    ;;
    stop)
    echo -n "Stopping $DESC: $NAME"
    d_stop
    echo "."
    ;;
    restart)
    echo -n "Restarting $DESC: $NAME"
    d_stop
    sleep 1
    d_start
    echo "."
    ;;
    *)
    echo "usage: $NAME {start|stop|restart}"
    exit 1
    ;;
esac

exit 0
32
Łukasz Rżanek

コマンドの最後に&を追加した後に行う必要がある重要なことが1つあります。プロセスはまだターミナルにリンクされています。 Javaコマンドを実行した後、disownを実行する必要があります。

Java -jar yourApp.jar > log.txt &
disown

これで、ターミナルを閉じることができます。

6
skyronic

ここで必要なキーフレーズは、「プロセスのデーモン化」です。 Linux/Unixでシステムサーバープロセスが「d」で終わることが多い理由を疑問に思ったことはありませんか? 「d」は、歴史的な理由から「デーモン」の略です。

したがって、切り離して真のサーバープロセスになるプロセスを「デーモン化」と呼びます。

これは完全に一般的なものであり、Javaプロセスに限定されません。

真に独立したデーモンプロセスになるために必要なタスクがいくつかあります。ウィキペディアのページにリストされています。

心配する必要がある2つの主なものは次のとおりです。

  • 親プロセスから切り離す
  • プロセスを作成したttyからデタッチします

「プロセスのデーモン化」というフレーズをグーグルで検索すると、これを達成するための多くの方法と、それが必要な理由に関する詳細が見つかります。

ほとんどの人は、小さなシェルスクリプトを使用してJavaプロセスを開始し、その後、Javaコマンドを '&'で終了してバックグラウンドで開始します。次に、起動スクリプトプロセスが終了すると、Javaプロセスはまだ実行中であり、現在は停止しているスクリプトプロセスから切り離されます。

3
kittylyst

コマンドラインの最後に&を付けてみましたか?例えば:

Java -jar mySocketApp.jar &

bgおよびfgコマンドを使用して、プロセスをバックグラウンドに送信することもできます。前景。 CTRL + Zで実行中のプロセスを一時停止できます。

この記事をご覧ください: http://lowfatlinux.com/linux-processes.html

1
Ata S.

試して、

 Java -jar yourApp.jar &

&は新しいプロセススレッドを開始します。これはテストしていませんが、それでも動作しない場合は、スクリプトファイルでそれを繰り返し、&でiを開始します

ステップ1。

新しい画面を作成するには

_screen -RD screenname
_

ステップ2。

スクリーン端末に入るには

_press Enter_

ステップ3。

新しく開いたターミナルで(バックグラウンドで実行するために)コマンドまたはスクリプトを実行します

ステップ4。

スクリーン端末から出てくるには

_ctrl + A + D_

ステップ5。

画面端末を一覧表示するには

_screen -ls
_

それは以下のようなものを印刷します

There is a screen on: 994.screenname (12/10/2018 09:24:31 AM) (Detached) 1 Socket in /run/screen/S-contact.

ステップ6。

バックグラウンドプロセスにログインするには

_screen -rd 994.screenname
_
0
SuperNova