2012-02-24 11 views
22

私はうまくいきますJavaソケットサーバー接続を開発しました。linuxのバックグラウンドプロセス

端末から起動されると、クライアントからのリッスンから開始されます。しかし、私が端末を閉じると、それは聞こえなくなります。

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

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

+0

http://stackoverflow.com/questions/2151214/is-it-possible-to-double-fork-a-process-in-java – tMC

答えて

30

あなたがそのようなことを達成することができますいくつかの方法があります。

  1. nohup java -server myApplication.jar > /log.txt - これはかなり単純です。アプリケーションをバックグラウンドに置くだけです。これは動作しますが、そうするのは非常に良い方法ではありません。
  2. シェルラッパーと上記のOR daemonアプリを使用してください。このアプローチは多くのオープンソースプロジェクトで使用されており、ほとんどのシナリオでは非常に有効です。さらに、init.dに含めることができ、通常の開始、停止、およびステータスコマンドで実行レベルが必要です。私は必要に応じて例を挙げることができます。
  3. Java Service WrapperまたはApache Jakarta Commons Daemonのいずれかを使用して、独自のデーモンサーバーを構築します。再び - どちらも非常に普及しており、十分にテストされ、信頼できるものです。 LinuxとWindowsの両方で利用できます! Apache CommonsのものがTomcatサーバーで使用されています!さらに、Akumaがあります。

あなたが将来的にこのサーバを使用し、および/またはクライアントに配布し、エンドユーザーが必要な場合は個人的に私はnohupなど、溶液2または3となるだろうあなたが何かを実行していない持っている必要があれば良いです問題のより複雑な解決策を開発する時間。

広告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 
+0

Rzanek Answer Answerありがとうございます。私はオプション2と一緒に行きたいと思っています。 – user861973

1

&をコマンドラインの最後に置いてみましたか?たとえば :

java -jar mySocketApp.jar & 

またBGと背景と前景にプロセスを送信するためのコマンドFGを使用することができます。実行中のプロセスを一時停止するには、CTRL + Zを実行します。

この記事をそれをチェックアウト:http://lowfatlinux.com/linux-processes.html

1

試して、

java -jar yourApp.jar & 

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

5

コマンドの最後に&を追加した後に行う必要がある重要なことがあります。プロセスはまだ端末にリンクされています。 javaコマンドを実行した後にdisownを実行する必要があります。

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

ここで、端末を閉じることができます。

+1

そのコマンドは私のためには機能しませんでした。 'java -jar yourApp .jar> log.txt& '最後に'& 'ではなくubuntuを使ってください。 – wired00

3

ここで必要なキーワードは、「プロセスをデーモン化する」ことです。 Linux/Unix上のシステムサーバープロセスがしばしば 'd'で終了するのはなぜだろうか? 'd'は歴史的な理由から「デーモン」の略です。

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

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

本当に独立したデーモンプロセスになるためには、いくつかの作業が必要です。それらはWikipediaのページに掲載されています。あなたが心配する必要がある2つの主なものはあり

  • デタッチ親プロセスから
  • デタッチフレーズをグーグル場合は、プロセス

を作成したttyから「daemonizing 「プロセス」では、これを達成するための一連の方法と、なぜそれが必要なのかについてさらに詳細な情報があります。

ほとんどの人は、ちょうど小さなシェルスクリプトを使ってJavaプロセスを起動し、Javaコマンドを '&'で終了してバックグラウンドモードで起動します。その後、起動スクリプト・プロセスが終了すると、Javaプロセスはまだ実行されており、今終了していないスクリプト・プロセスから切り離されます。

関連する問題