在 Linux 上執行 Java 應用程式作為服務


在 Linux 中,簡單的服務是指在後臺執行並執行特定功能或一組功能的程式。這些程式可以在啟動時自動啟動,並可以使用命令列或系統服務管理器(例如 systemd 或 Upstart)進行控制。

要在 Linux 中建立簡單的服務,首先要編寫執行所需功能的程式。此程式應設計為在後臺執行,即使終端視窗或 SSH 會話關閉後也能繼續執行。

接下來,建立一個可以啟動、停止和檢查程式狀態的指令碼。此指令碼通常放置在 /etc/init.d/ 目錄中,並且應使其可執行。然後,可以使用 systemctl 或 service 等命令將其註冊到系統服務管理器。

註冊後,可以使用標準命令(例如 systemctl start|stop|status myservice 或 service myservice start|stop|status)控制服務。

服務檔案

服務檔案,也稱為單元檔案,是系統服務管理器(例如 systemd 或 Upstart)用於控制 Linux 中服務的配置檔案。它描述瞭如何啟動、停止和管理服務,幷包含可用於自定義服務行為的各種設定和選項。

服務檔案通常具有簡單的結構,並使用宣告性語言編寫。它由一系列部分組成,每個部分包含特定的配置選項。最重要的部分是 [Unit]、[Service] 和 [Install]。

  • [Unit] − 包含有關服務的資訊,例如其名稱、描述和依賴項。

  • [Service] − 包含有關如何執行服務的資訊,例如啟動和停止服務的命令,以及服務應在其下執行的使用者和組。

  • [Install] − 包含有關如何安裝和啟用服務的資訊,例如應啟動和停止服務的執行級別。

這是一個名為“myservice”的簡單服務檔案的示例:

 [Unit]
Description=My Service
After=network.target

[Service]
User=myservice
Group=myservice
ExecStart=/usr/bin/myservice
Restart=always

[Install]
WantedBy=multi-user.target

建立服務檔案後,應將其放置在相應的目錄(通常為 /etc/systemd/system 或 /etc/init)中,然後可以使用標準命令(例如 systemctl start|stop|status myservice)控制服務。

分叉服務

分叉服務是一種啟動程式的多個例項的服務型別,每個例項都在其自己的程序中執行。在 Java 應用程式的上下文中,分叉服務將涉及啟動多個 Java 虛擬機器 (JVM) 來執行相同的應用程式,每個 JVM 都在其自己的程序中執行。

以下是如何為 Java 應用程式建立分叉服務的一個示例:

編寫一個指令碼,啟動 Java 應用程式併為每個例項分叉一個新程序。此指令碼應接受命令列引數以指定要分叉的例項數以及任何其他必要的配置選項。

使用 nohup 命令在後臺執行指令碼,並防止在關閉終端時終止它。

使用 for 迴圈啟動命令列引數中指定的 n 個例項。

for ((i=1;i<=$instance_count;i++)); do
    nohup java -jar myapp.jar &
done

建立服務檔案並使用 systemctl 或 service 命令將其註冊到系統服務管理器。

[Unit]
Description=My Java Forking Service

[Service]
ExecStart=/usr/local/bin/start-my-service.sh
Restart=always
User=myuser

[Install]
WantedBy=multi-user.target

註冊後,可以使用標準命令(例如 systemctl start|stop|status myservice)控制服務。

請注意,這只是為 Java 應用程式建立分叉服務的一種示例,根據應用程式的具體情況和其執行的環境,還有其他方法可以達到相同的結果。

註冊和執行服務

為 Java 應用程式建立服務檔案後,可以將其註冊到系統服務管理器,使其在啟動時自動啟動,並允許使用標準命令進行控制。

註冊和執行服務的過程取決於使用的系統服務管理器。

例如,對於 systemd,可以使用以下命令註冊和執行服務:

將服務檔案複製到 /etc/systemd/system 目錄。

重新載入 systemd 以讀取服務檔案。

systemctl daemon-reload

啟用服務以在啟動時自動啟動。

systemctl enable myservice

啟動服務。

systemctl start myservice

檢查服務狀態。

systemctl status myservice

停止服務。

systemctl stop myservice

對於像 Ubuntu 14.04 及更早版本的 sysvinit 基於的發行版使用 update-rc.d。

update-rc.d myservice defaults

對於 Upstart,該過程類似,但將使用 initctl 命令而不是 systemctl。

值得注意的是,如果在 docker 等容器中執行應用程式,則無需擔心註冊和執行服務的此過程。應處理容器以在啟動時啟動。

在 Linux 上執行 Java 應用程式作為服務

在 Linux 上將 Java 應用程式作為服務執行涉及建立描述如何啟動、停止和管理應用程式的服務檔案,然後將該服務檔案註冊到系統服務管理器。

以下是如何在 Linux 上將 Java 應用程式作為服務執行的示例:

建立一個啟動 Java 應用程式的指令碼。此指令碼應使用 nohup 命令在後臺執行應用程式,並防止在關閉終端時終止它。

nohup java -jar /path/to/your/application.jar &

建立一個具有所需服務配置的服務檔案。服務檔案應包含諸如服務名稱、執行服務的使用者名稱和組以及啟動和停止服務的命令等資訊。

[Unit]
Description=My Java Application Service
After=network.target

[Service]
User=myuser
Group=myuser
ExecStart=/usr/local/bin/start-my-application.sh
Restart=always

[Install]
WantedBy=multi-user.target

將服務檔案註冊到系統服務管理器。在使用 systemd 的系統上,可以使用 systemctl 命令註冊服務,例如:

systemctl enable myservice

啟動服務

systemctl start myservice

檢查服務狀態。

systemctl status myservice

停止服務。

systemctl stop myservice

值得注意的是,以上步驟和示例適用於使用 systemd 作為服務管理器的系統。其他服務管理器(如 SysV 或 Upstart)的過程略有不同,但總體思路相同。

結論

在 Linux 上將 Java 應用程式作為服務執行涉及建立描述如何啟動、停止和管理應用程式的服務檔案,然後將該服務檔案註冊到系統服務管理器。

此過程涉及建立一個使用 nohup 命令啟動 Java 應用程式的指令碼,以便在後臺執行應用程式並在關閉終端時防止其終止。

更新於:2023年1月24日

7K+ 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告