jsvc (Apache Commons Daemon) 能將 Java 應用包裝為原生系統服務,支援:以特定使用者身分執行、自動重導標準輸出/錯誤、PID 檔管理、優雅啟動/關閉生命週期回調。Tomcat 內建 jsvc.tar.gz 供編譯原生啟動器。
cd $CATALINA_HOME/bin
tar xvfz jsvc.tar.gz
cd jsvc-src
sh support/buildconf.sh
chmod 755 configure
./configure --with-java=/usr/local/java # 指向 JDK 路徑
make
# 產出 jsvc 執行檔於當前目錄
必須實作四個非靜態方法(init(String[])、start()、stop()、destroy()),main() 可選。
package com.example.daemon;
public class MyDaemon {
public void init(String[] args) throws Exception {
System.out.println("init(args) - 服務初始化,解析參數");
}
public void start() throws Exception {
System.out.println("start() - 啟動核心業務執行緒");
// 啟動 ServerSocket、排程器、訊息消費者等
}
public void stop() throws Exception {
System.out.println("stop() - 通知業務執行緒優雅關閉");
}
public void destroy() throws Exception {
System.out.println("destroy() - 釋放資源、關閉連線池");
}
}
jar cvf mydaemon.jar com/example/daemon/MyDaemon.class
mkdir -p /opt/mydaemon/lib
cp mydaemon.jar /opt/mydaemon/lib/
cp $CATALINA_HOME/bin/commons-daemon.jar /opt/mydaemon/lib/
#!/bin/sh
# chkconfig: - 80 20
# description: My Java Daemon Service
JAVA_HOME=/usr/java/jdk1.8.0
DAEMON_HOME=/opt/mydaemon
JSVC=/usr/local/tomcat/bin/jsvc-src/jsvc
USER=daemonuser
PID_FILE=/var/run/mydaemon.pid
LOG_OUT=$DAEMON_HOME/logs/daemon.out
LOG_ERR=$DAEMON_HOME/logs/daemon.err
CLASSPATH=$DAEMON_HOME/lib/mydaemon.jar:$DAEMON_HOME/lib/commons-daemon.jar
case "$1" in
start)
$JSVC -user $USER -home $JAVA_HOME -Djava.io.tmpdir=/var/tmp \
-pidfile $PID_FILE -outfile $LOG_OUT -errfile $LOG_ERR \
-cp $CLASSPATH com.example.daemon.MyDaemon
;;
stop)
$JSVC -stop -pidfile $PID_FILE com.example.daemon.MyDaemon
;;
restart)
$0 stop
sleep 2
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit 0
chmod 755 /etc/init.d/mydaemon
chkconfig --add mydaemon
chkconfig --level 345 mydaemon on # 多使用者模式自動啟動
service mydaemon start # 啟動
service mydaemon stop # 停止
tail -f /opt/mydaemon/logs/daemon.out # 觀察輸出
# start 後日誌 execute init(args) method execute start method # stop 後日誌 execute stop method execute destroy method
.service 檔,使用 Type=forking、PIDFile=、ExecStart=、ExecStop=。-Dkey=value 傳遞配置,避免硬編碼。ulimit -n、啟用 Java Security Manager。-verbose -debug 參數輸出 JVM 與 jsvc 詳細日誌。jsvc 讓 Java 程式以原生系統服務身分運行,解決「誰啟動、誰監控、誰記錄日誌、如何優雅關閉」的生產級部署痛點。配合 Systemd/SysV Init,實現開機自啟、崩潰重啟、統一運維。