2011-10-07 11 views
33

私はプログラムを作成しましたが、今はデーモンに変換する予定です。私はnoobで何も知らないので、どうすればいいのか教えてもらえますか、それとも基本的なチュートリアルや読み物を教えてください。私は本当に私がそれをやる方法を学びたいですか?jsvcを使ってJavaプログラムをデーモンに変換するには?

ありがとうございました

+1

はThreadクラスでは、setdaemon()があります。あなたはそれを探していますか?このメソッドのjavadocをチェックすると、その方法を理解できます。 –

答えて

66

Javaクラス:

package example; 

import java.util.Date; 
import java.util.Timer; 
import java.util.TimerTask; 
import org.apache.commons.daemon.*; 

class EchoTask extends TimerTask { 
    @Override 
    public void run() { 
     System.out.println(new Date() + " running ..."); 
    } 
} 

public class Main implements Daemon { 

    private static Timer timer = null; 

    public static void main(String[] args) { 
     timer = new Timer(); 
     timer.schedule(new EchoTask(), 0, 1000); 
    } 

    @Override 
    public void init(DaemonContext dc) throws DaemonInitException, Exception { 
     System.out.println("initializing ..."); 
    } 

    @Override 
    public void start() throws Exception { 
     System.out.println("starting ..."); 
     main(null); 
    } 

    @Override 
    public void stop() throws Exception { 
     System.out.println("stopping ..."); 
     if (timer != null) { 
      timer.cancel(); 
     } 
    } 

    @Override 
    public void destroy() { 
     System.out.println("done."); 
    } 

} 

シェル/停止スクリプトを起動します。

#!/bin/sh 

# Setup variables 
EXEC=/usr/bin/jsvc 
JAVA_HOME=/usr/lib/jvm/java-6-sun 
CLASS_PATH="/usr/share/java/commons-daemon.jar":"/path/to/your.jar" 
CLASS=example.Main 
USER=foo 
PID=/tmp/example.pid 
LOG_OUT=/tmp/example.out 
LOG_ERR=/tmp/example.err 

do_exec() 
{ 
    $EXEC -home "$JAVA_HOME" -cp $CLASS_PATH -user $USER -outfile $LOG_OUT -errfile $LOG_ERR -pidfile $PID $1 $CLASS 
} 

case "$1" in 
    start) 
     do_exec 
      ;; 
    stop) 
     do_exec "-stop" 
      ;; 
    restart) 
     if [ -f "$PID" ]; then 
      do_exec "-stop" 
      do_exec 
     else 
      echo "service not running, will do nothing" 
      exit 1 
     fi 
      ;; 
    *) 
      echo "usage: daemon {start|stop|restart}" >&2 
      exit 3 
      ;; 
esac 

そして効果:

$ ./service start && sleep 5 && ./service stop 
$ cat /tmp/example.out 
initializing ... 
starting ... 
Fri Oct 07 16:26:54 EEST 2011 running ... 
Fri Oct 07 16:26:55 EEST 2011 running ... 
Fri Oct 07 16:26:56 EEST 2011 running ... 
Fri Oct 07 16:26:57 EEST 2011 running ... 
Fri Oct 07 16:26:58 EEST 2011 running ... 
stopping ... 
done. 
+0

良いアプローチですが、私は念頭に置いて1つの質問があります。依存するjarファイルが複数ある場合、クラスパスをどのように定義しますか?スクリプトごとに個別に定義する必要がありますか? – Switch

+0

@MMRUser:依存jarが 'your.jar'マニフェストで指定されている場合、あなたはそうしません。 –

+0

@barti_ddu非常に良い例です。それでも使える。本当にありがとう!!! – Alex

4

jsvcを使用する必要がありますか?アプリケーションをポートにバインドしてブート時に実行したいだけの場合は、そのアプリケーションを使用する必要はありません。 jsvcを使用すると、アプリケーションを特権ポート(< 1024)にバインドして、通常のユーザーとして実行を再開できます。

+0

実際に私はそうすると確信しています。しかし、私は実際にそれを行う方法を知らない – Ozer

+0

jsvcは、スタートアップエラー処理、PIDトラッキング、クリーンシャットダウンなども提供します。これらの機能を持たないJavaベースのアプリケーションをLinuxサービスとして実行するのは難しいことです。 –

関連する問題