首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Linux 下以 jsvc 將 Java 程式安裝為 Systemd/SysV Init 服務完整教學

     編輯:Java 程式設計入門

jsvc 介紹

jsvc (Apache Commons Daemon) 能將 Java 應用包裝為原生系統服務,支援:以特定使用者身分執行、自動重導標準輸出/錯誤、PID 檔管理、優雅啟動/關閉生命週期回調。Tomcat 內建 jsvc.tar.gz 供編譯原生啟動器。

步驟 1:編譯 jsvc 原生二進制

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 執行檔於當前目錄

步驟 2:實作服務生命週期類別

必須實作四個非靜態方法(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() - 釋放資源、關閉連線池");
    }
}

步驟 3:打包 JAR 與準備 Classpath

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/

步驟 4:撰寫 SysV Init 啟動腳本 (/etc/init.d/mydaemon)

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

步驟 5:註冊與管理服務

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

進階提示

  • Systemd 服務單元:現代發行版建議改寫 .service 檔,使用 Type=forking、PIDFile=、ExecStart=、ExecStop=。
  • 環境變數注入:腳本中 -Dkey=value 傳遞配置,避免硬編碼。
  • 安全強化:專用低權限使用者、限制檔案描述符 ulimit -n、啟用 Java Security Manager。
  • 除錯:-verbose -debug 參數輸出 JVM 與 jsvc 詳細日誌。

結語

jsvc 讓 Java 程式以原生系統服務身分運行,解決「誰啟動、誰監控、誰記錄日誌、如何優雅關閉」的生產級部署痛點。配合 Systemd/SysV Init,實現開機自啟、崩潰重啟、統一運維。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved