如何將java -jar啟動的服務(wù)設(shè)置為systemd服務(wù)管理方式
要將一個使用 java -jar
命令啟動的服務(wù)設(shè)置為由 systemd
進(jìn)行管理,你需要創(chuàng)建一個 .service
文件并將其放置在 /etc/systemd/system/
目錄下。
以下是創(chuàng)建和配置這樣一個服務(wù)文件的詳細(xì)步驟:
步驟 1: 準(zhǔn)備工作
確定Java環(huán)境:
確保系統(tǒng)中已經(jīng)安裝了Java,并且知道Java的安裝路徑(如 /usr/lib/jvm/java-1.8.0-openjdk-amd64
或 /usr/java/jdk1.8.0_211
)??梢酝ㄟ^命令 which java
查找實(shí)際的可執(zhí)行文件路徑。
準(zhǔn)備JAR文件:
確認(rèn)你的Java應(yīng)用程序的JAR文件路徑,例如 /opt/services/myapp/myapp.jar
。確保該JAR文件具有適當(dāng)?shù)臋?quán)限,使得 systemd
用戶(通常為 root
或者 system
用戶組)能夠訪問。
步驟 2: 創(chuàng)建.service文件
使用文本編輯器(如 vi
, nano
, 或 gedit
),創(chuàng)建一個名為 myapp.service
的文件,將其保存在 /etc/systemd/system/
目錄下。
以下是一個基本的 .service
文件模板:
[Unit] Description=My Java Application Service After=network.target [Service] User=<非root用戶> # 如果需要以非root用戶運(yùn)行,填寫用戶名;否則可以省略此行 Group=<用戶組> # 如果需要指定用戶組,填寫用戶組名;否則可以省略此行 Restart=on-failure # 當(dāng)服務(wù)崩潰時自動重啟 RestartSec=10s # 重啟前等待10秒 Environment="JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64" Environment="JAR_FILE=/opt/services/myapp/myapp.jar" ExecStart=/usr/bin/java -jar $JAR_FILE ExecStop=/bin/kill -SIGTERM $MAINPID [Install] WantedBy=multi-user.target
說明:
[Unit]
部分:
Description
: 提供服務(wù)的簡短描述。After
: 指定服務(wù)應(yīng)在哪些服務(wù)之后啟動,這里設(shè)置為在網(wǎng)絡(luò)服務(wù) (network.target
) 完成后啟動。
[Service]
部分:
User
和Group
: 如果希望服務(wù)以非root
用戶和用戶組運(yùn)行,指定相應(yīng)的用戶名和用戶組名。Restart
和RestartSec
: 設(shè)置當(dāng)服務(wù)崩潰時自動重啟策略,這里是on-failure
表示失敗時重啟,RestartSec
指定了重啟前等待的時間。Environment
: 設(shè)置環(huán)境變量,這里指定了JAVA_HOME
(Java安裝路徑)和JAR_FILE
(應(yīng)用程序JAR文件路徑)。ExecStart
: 定義啟動服務(wù)的命令,使用java -jar
命令啟動指定的JAR文件,通過$JAR_FILE
引用之前定義的環(huán)境變量。ExecStop
: 定義停止服務(wù)的命令,這里使用kill
命令發(fā)送SIGTERM
信號給主進(jìn)程ID($MAINPID
),以優(yōu)雅地關(guān)閉服務(wù)。
[Install]
部分:
WantedBy
: 指定服務(wù)應(yīng)隨哪個目標(biāo)(target
)啟動。- 這里設(shè)置為
multi-user.target
,意味著在多用戶系統(tǒng)(非單用戶模式或圖形界面)啟動時,該服務(wù)會被自動啟動。
步驟 3: 配置服務(wù)
更新服務(wù)配置:
執(zhí)行以下命令,使 systemd
重新加載配置文件:
sudo systemctl daemon-reload
啟用服務(wù):
若要讓服務(wù)在系統(tǒng)啟動時自動運(yùn)行,執(zhí)行:
sudo systemctl enable myapp.service
啟動服務(wù):
立即啟動服務(wù):
sudo systemctl start myapp.service
檢查服務(wù)狀態(tài):
確認(rèn)服務(wù)是否正常運(yùn)行:
sudo systemctl status myapp.service
如果一切正常,你應(yīng)該能看到服務(wù)狀態(tài)為 active (running)
。
附加說明
日志管理:
默認(rèn)情況下,服務(wù)的標(biāo)準(zhǔn)輸出和錯誤輸出將被重定向到 systemd
的 journal。你可以使用 journalctl
命令查看服務(wù)的日志:
journalctl -u myapp.service
自定義啟動參數(shù):
如果你的Java應(yīng)用需要額外的啟動參數(shù),可以在 ExecStart
行中直接添加,例如:
ExecStart=/usr/bin/java -jar $JAR_FILE --param1=value1 --param2=value2
權(quán)限與限制:
根據(jù)需要,你還可以在 [Service]
部分設(shè)置資源限制(如內(nèi)存、CPU限制)、工作目錄、文件描述符限制等。查閱 systemd.exec(5)
手冊頁了解更多信息。
完成以上步驟后,你的Java應(yīng)用程序就已成功配置為由 systemd
管理的服務(wù),可以方便地進(jìn)行啟動、停止、重啟以及查看狀態(tài)和日志。
需要使用nohup保持后臺運(yùn)行嗎
在使用 systemd
管理服務(wù)的情況下,通常不需要使用 nohup
命令來保持服務(wù)在后臺運(yùn)行。
systemd
已經(jīng)提供了完善的后臺服務(wù)管理機(jī)制,它能夠確保服務(wù)進(jìn)程在后臺持續(xù)運(yùn)行,并在必要時根據(jù)配置自動重啟服務(wù)。
在上述 myapp.service
示例中,ExecStart
參數(shù)定義了啟動服務(wù)的命令:
ExecStart=/usr/bin/java -jar $JAR_FILE
這里直接使用 java -jar
命令啟動Java應(yīng)用程序,無需加上 nohup
。systemd
會負(fù)責(zé)管理這個進(jìn)程的生命周期,確保它在后臺運(yùn)行,不受終端會話影響,并在服務(wù)停止時正確清理資源。
因此,當(dāng)您按照上述步驟將Java應(yīng)用程序配置為 systemd
服務(wù)后,就不需要再使用 nohup
命令來保持其后臺運(yùn)行。systemd
提供的穩(wěn)定性和可靠性足以滿足大多數(shù)生產(chǎn)環(huán)境的需求。
如果您在Jenkins Pipeline中需要啟動這個服務(wù),可以直接調(diào)用 systemctl start myapp.service
,而不是使用 nohup java -jar ... &
。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringCloud中的Hystrix保護(hù)機(jī)制詳解
這篇文章主要介紹了SpringCloud中的Hystrix保護(hù)機(jī)制詳解,Hystrix,英文意思是豪豬,全身是刺,看起來就不好惹,是一種保護(hù)機(jī)制,Hystrix也是Netflix公司的一款組件,需要的朋友可以參考下2023-12-12Spring Security中successHandler和failureHandler使用方式
這篇文章主要介紹了Spring Security中successHandler和failureHandler使用方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08MyBatis-plus數(shù)據(jù)庫字段排序不準(zhǔn)確的解決
這篇文章主要介紹了MyBatis-plus數(shù)據(jù)庫字段排序不準(zhǔn)確的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02SpringBoot排除自動加載數(shù)據(jù)源方式
這篇文章主要介紹了SpringBoot排除自動加載數(shù)據(jù)源方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05SpringCloud灰度發(fā)布的設(shè)計(jì)與實(shí)現(xiàn)詳解
這篇文章主要介紹了SpringCloud灰度發(fā)布的設(shè)計(jì)與實(shí)現(xiàn)詳解,灰度從字面意思理解就是存在于黑與白之間的一個平滑過渡的區(qū)域,所以說對于互聯(lián)網(wǎng)產(chǎn)品來說,上線和未上線就是黑與白之分,而實(shí)現(xiàn)未上線功能平穩(wěn)過渡的一種方式就叫做灰度發(fā)布,需要的朋友可以參考下2023-09-09springboot開發(fā)擴(kuò)展springmvc實(shí)現(xiàn)解析
這篇文章主要介紹了springboot開發(fā)擴(kuò)展springmvc實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02