我寫了一個程序,現在我期望將它轉換爲守護進程。由於我是一個noob,不知道任何關於它的事情,你能告訴我我該怎麼做,或者你能給我一些基本的教程或者閱讀嗎?我真的很想學習如何做到這一點?如何使用jsvc將java程序轉換爲守護程序?
謝謝大家
我寫了一個程序,現在我期望將它轉換爲守護進程。由於我是一個noob,不知道任何關於它的事情,你能告訴我我該怎麼做,或者你能給我一些基本的教程或者閱讀嗎?我真的很想學習如何做到這一點?如何使用jsvc將java程序轉換爲守護程序?
謝謝大家
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.
您是否100%確定您需要使用jsvc?如果你只是想讓你的應用綁定到一個端口並在啓動時運行,那麼你不需要使用它。 jsvc允許您的應用程序綁定到特權端口(< 1024),然後以普通用戶身份繼續運行。
其實我很確定,因爲我期望這樣做。但我真的不知道該怎麼做 – Ozer
jsvc也給你啓動錯誤處理,PID跟蹤和乾淨關閉等事情。將基於Java的應用程序作爲沒有這些功能的Linux服務運行可能會非常棘手。 –
查看Jakarta Commons Daemon文檔。有一個示例說明如何在their wiki上實現Daemon
接口。執行Daemon
後,您應該能夠按照"Starting jsvc" and "Using jsvc" docs開始該過程。
有setDaemon()的線程類。你在找那個嗎?如果您檢查此方法的javadoc,則可以瞭解如何執行此操作。 –