2011-10-07 8 views
33

मैंने एक कार्यक्रम लिखा और अब मुझे इसे एक डेमॉन में बदलने की उम्मीद है। चूंकि मैं नोब हूं और इसके बारे में कुछ भी नहीं जानता, क्या आप कृपया मुझे बता सकते हैं कि मैं इसे कैसे कर सकता हूं या क्या आप कृपया मुझे इसके बारे में बुनियादी ट्यूटोरियल या रीडिंग दे सकते हैं? मैं वास्तव में सीखना चाहता हूं कि मैं इसे कैसे कर सकता हूं?jsvc के साथ जावा प्रोग्राम को डिमन में कैसे परिवर्तित करें?

धन्यवाद सभी

+1

setDaemon() थ्रेड कक्षा में नहीं है। क्या आप इसकी तलाश कर रहे हैं? यदि आप इस विधि के लिए जावाडोक की जांच करते हैं, तो आप समझ सकते हैं कि इसे कैसे करें। –

उत्तर

66

जावा वर्ग:

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

अच्छा दृष्टिकोण, लेकिन मेरे मन में एक सवाल है। यदि एक से अधिक आश्रित जार फाइलें हैं तो आप क्लासपाथ को कैसे परिभाषित करते हैं? क्या आपको अपनी स्क्रिप्ट के अनुसार अलग-अलग एक को परिभाषित करने की ज़रूरत है? – Switch

+0

@ एमएमआरयूसर: यदि निर्भर जार 'your.jar' मेनिफेस्ट में निर्दिष्ट हैं, तो आप नहीं करते हैं। –

+0

@barti_ddu बहुत अच्छा उदाहरण है। और अभी भी प्रयोग योग्य। बहुत धन्यवाद!!! – Alex

4

आप 100% कर रहे हैं सुनिश्चित करें कि आप jsvc उपयोग करने की आवश्यकता? यदि आप बस अपना आवेदन बंदरगाह से बांधना चाहते हैं और बूट समय पर चलाना चाहते हैं, तो आपको इसका उपयोग करने की आवश्यकता नहीं है। जेएसवीसी आपके एप्लिकेशन को एक विशेषाधिकृत बंदरगाह (< 1024) से जुड़ने की अनुमति देता है और उसके बाद सामान्य उपयोगकर्ता के रूप में चलना शुरू कर देता है।

+0

असल में मुझे यकीन है क्योंकि मुझे ऐसा करने की उम्मीद है। लेकिन मुझे वास्तव में यह नहीं पता कि – Ozer

+0

जेएसवीसी आपको स्टार्टअप त्रुटि हैंडलिंग, पीआईडी ​​ट्रैकिंग और क्लीन शट डाउन जैसी चीजें भी देता है। जावा-आधारित ऐप को उन सुविधाओं के बिना लिनक्स सेवा के रूप में चलाने में मुश्किल हो सकती है। –

3

Jakarta Commons Daemon दस्तावेज़ीकरण देखें। their wiki पर Daemon इंटरफ़ेस को कार्यान्वित करने का एक उदाहरण है। एक बार जब आप Daemon लागू कर लेंगे, तो आपको "Starting jsvc" and "Using jsvc" docs का पालन करके प्रक्रिया शुरू करने में सक्षम होना चाहिए।

संबंधित मुद्दे