2011-10-07 36 views
33

Tôi đã viết một chương trình và bây giờ tôi dự kiến ​​sẽ chuyển đổi nó thành một daemon. Kể từ khi tôi là một noob và không biết bất cứ điều gì về nó, bạn có thể vui lòng cho tôi biết làm thế nào tôi có thể làm điều đó hoặc bạn có thể xin vui lòng cho tôi hướng dẫn cơ bản hoặc đọc về nó? Tôi thực sự muốn tìm hiểu làm thế nào tôi có thể làm điều đó?Làm thế nào để chuyển đổi một chương trình java thành daemon với jsvc?

Cảm ơn tất cả

+1

Có setDaemon() trong Chủ đề Class. Bạn đang tìm kiếm điều đó? Nếu bạn kiểm tra javadoc cho phương pháp này, bạn có thể hiểu làm thế nào để làm điều đó. –

Trả lời

66

lớp 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."); 
    } 

} 

Shell bắt đầu/dừng kịch bản:

#!/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 

Và có hiệu lực:

$ ./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

Cách tiếp cận tốt đẹp, nhưng tôi có một câu hỏi trong đầu. Làm thế nào để bạn định nghĩa classpath nếu có nhiều hơn một tệp jar phụ thuộc? Tôi có cần định nghĩa riêng từng cái một theo kịch bản của bạn không? – Switch

+0

@MMRUser: nếu các jars phụ thuộc được chỉ định trong tệp kê khai 'your.jar', bạn thì không. –

+0

@barti_ddu Ví dụ rất hay. Và vẫn có thể sử dụng được. Cảm ơn nhiều!!! – Alex

4

Bạn chắc chắn 100% bạn cần sử dụng jsvc? Nếu bạn chỉ muốn ứng dụng của bạn liên kết với một cổng và chạy lúc khởi động, bạn không cần phải sử dụng nó. jsvc cho phép ứng dụng của bạn liên kết với một cổng đặc quyền (< 1024) và sau đó tiếp tục chạy như một người dùng bình thường.

+0

Thực ra tôi chắc chắn vì tôi dự kiến ​​sẽ làm như vậy. Nhưng tôi thực sự không biết làm thế nào để làm điều đó – Ozer

+0

jsvc cũng cung cấp cho bạn những thứ như xử lý lỗi khởi động, theo dõi PID và tắt máy sạch. Nó có thể là khó khăn để có được một ứng dụng dựa trên Java chạy như một dịch vụ Linux mà không có các tính năng đó. –

Các vấn đề liên quan