linux中nohup?java?-jar啟動(dòng)java項(xiàng)目的步驟
理解nohup命令
nohup命令的基本概念
nohup
是一個(gè)常用的Unix命令,用于在忽略掛起信號(hào)(SIGHUP)的情況下運(yùn)行指定的命令或進(jìn)程。當(dāng)用戶注銷或關(guān)閉終端時(shí),通常后臺(tái)運(yùn)行的進(jìn)程會(huì)收到SIGHUP信號(hào)而終止。使用nohup
可以避免這種情況,使得進(jìn)程即使在用戶注銷后也能繼續(xù)運(yùn)行。
nohup的工作原理
nohup
通過忽略SIGHUP信號(hào)來實(shí)現(xiàn)命令的持續(xù)運(yùn)行。當(dāng)nohup
命令被執(zhí)行時(shí),它會(huì)啟動(dòng)一個(gè)新的進(jìn)程,并將該進(jìn)程的SIGHUP信號(hào)屏蔽,這樣即使終端關(guān)閉,該進(jìn)程也不會(huì)受到影響。
nohup與后臺(tái)進(jìn)程的區(qū)別
后臺(tái)進(jìn)程可以通過在命令后添加&
符號(hào)來啟動(dòng),如command &
。然而,后臺(tái)進(jìn)程在用戶注銷后通常無法繼續(xù)運(yùn)行,因?yàn)樗鼈儠?huì)收到SIGHUP信號(hào)。與之相比,nohup
啟動(dòng)的進(jìn)程則不會(huì)受到用戶注銷的影響。
示例:使用nohup啟動(dòng)Java應(yīng)用
假設(shè)我們有一個(gè)名為MyApp.jar
的Java應(yīng)用程序,我們希望在后臺(tái)運(yùn)行它,即使用戶注銷或關(guān)閉終端,應(yīng)用也能持續(xù)運(yùn)行。
啟動(dòng)命令
nohup java -jar MyApp.jar &
這個(gè)命令做了以下幾件事:
nohup
:告訴系統(tǒng)忽略掛起信號(hào)。java -jar MyApp.jar
:實(shí)際的Java命令,用于啟動(dòng)JAR文件。&
:將命令放入后臺(tái)執(zhí)行。
輸出重定向
默認(rèn)情況下,nohup
會(huì)將輸出重定向到名為nohup.out
的文件中。如果需要自定義輸出文件,可以使用重定向操作符:
nohup java -jar MyApp.jar > output.log 2>&1 &
這里:
>
:將標(biāo)準(zhǔn)輸出重定向到output.log
文件。2>&1
:將標(biāo)準(zhǔn)錯(cuò)誤也重定向到同一個(gè)文件。
查看進(jìn)程狀態(tài)
可以使用ps
命令查看nohup
啟動(dòng)的進(jìn)程狀態(tài):
ps -ef | grep MyApp.jar
停止進(jìn)程
要停止由nohup
啟動(dòng)的進(jìn)程,可以使用kill
命令結(jié)合進(jìn)程ID(PID):
kill -9 PID
其中,PID
是ps
命令查詢到的進(jìn)程ID。
案例源碼說明
以下是使用nohup
啟動(dòng)Java應(yīng)用的完整示例,包括啟動(dòng)、輸出重定向和進(jìn)程管理:
啟動(dòng)Java應(yīng)用
nohup java -jar /path/to/MyApp.jar > /path/to/output.log 2>&1 &
查看進(jìn)程
ps -ef | grep MyApp.jar
停止進(jìn)程
kill -9 $(pgrep -f MyApp.jar)
在這個(gè)例子中,pgrep -f MyApp.jar
用于查找所有與MyApp.jar
相關(guān)的進(jìn)程,然后kill -9
發(fā)送SIGKILL信號(hào)以強(qiáng)制終止進(jìn)程。
Java項(xiàng)目打包與部署
Java項(xiàng)目的打包流程
Java項(xiàng)目打包通常指的是將編譯后的.class
文件及其依賴項(xiàng)打包成一個(gè)可執(zhí)行的JAR(Java Archive)文件。這個(gè)過程可以通過多種工具完成,其中最常用的是Maven和Gradle。
使用Maven打包
<!-- 在pom.xml文件中配置build插件 --> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <configuration> <archive> <manifest> <mainClass>com.example.MyApp</mainClass> <!-- 主類全名 --> </manifest> </archive> </configuration> </plugin> </plugins> </build>
然后運(yùn)行Maven命令來打包項(xiàng)目:
mvn clean package
使用Gradle打包
在build.gradle
文件中配置Jar任務(wù):
jar { manifest { attributes 'Main-Class': 'com.example.MyApp' // 主類全名 } }
然后運(yùn)行Gradle命令來打包項(xiàng)目:
gradle build
創(chuàng)建可執(zhí)行的JAR文件
創(chuàng)建一個(gè)可執(zhí)行的JAR文件意味著JAR包含了一個(gè)清單文件(MANIFEST.MF),其中指定了程序的入口類。
Maven案例源碼
在pom.xml
中配置好maven-jar-plugin
后,執(zhí)行mvn package
命令,Maven會(huì)在target
目錄下生成一個(gè)包含所有依賴和配置好清單的JAR文件。
Gradle案例源碼
在build.gradle
中配置好Jar任務(wù)后,執(zhí)行gradle build
命令,Gradle會(huì)在build/libs
目錄下生成JAR文件。
部署策略與環(huán)境準(zhǔn)備
部署Java應(yīng)用程序需要考慮運(yùn)行環(huán)境的配置,包括JDK版本、系統(tǒng)權(quán)限、依賴庫等。
環(huán)境準(zhǔn)備
- 確保服務(wù)器上安裝了正確版本的JDK。
- 配置環(huán)境變量,如
JAVA_HOME
指向JDK安裝目錄。 - 確保服務(wù)器有適當(dāng)?shù)臋?quán)限設(shè)置,以便應(yīng)用程序可以運(yùn)行。
部署策略
- 直接部署:將生成的JAR文件上傳至服務(wù)器的指定目錄。
- 持續(xù)集成/持續(xù)部署(CI/CD):通過自動(dòng)化工具如Jenkins,自動(dòng)化測(cè)試和部署流程。
案例源碼說明
假設(shè)我們已經(jīng)使用Maven或Gradle成功打包了一個(gè)Java應(yīng)用程序,現(xiàn)在需要將其部署到服務(wù)器上。
Maven部署案例
- 運(yùn)行
mvn package
生成JAR文件。 - 使用SCP(安全復(fù)制)命令將JAR文件復(fù)制到服務(wù)器:
scp target/MyApp.jar username@server:/path/to/deployment
Gradle部署案例
- 運(yùn)行
gradle build
生成JAR文件。 - 使用SCP命令將JAR文件復(fù)制到服務(wù)器:
scp build/libs/MyApp.jar username@server:/path/to/deployment
一旦JAR文件上傳到服務(wù)器,就可以使用之前提到的nohup
命令來啟動(dòng)Java應(yīng)用程序。
使用nohup啟動(dòng)Java項(xiàng)目的步驟
準(zhǔn)備啟動(dòng)腳本
在部署Java項(xiàng)目后,創(chuàng)建一個(gè)啟動(dòng)腳本可以簡(jiǎn)化啟動(dòng)過程,并允許更靈活地管理Java應(yīng)用。以下是一個(gè)簡(jiǎn)單的啟動(dòng)腳本示例:
#!/bin/bash # Java應(yīng)用的JAR文件路徑 JAR_PATH="/path/to/MyApp.jar" # 定義日志文件輸出路徑 LOG_FILE="/path/to/MyApp.log" # 使用nohup命令啟動(dòng)Java應(yīng)用,并將輸出重定向到日志文件 nohup java -jar $JAR_PATH > $LOG_FILE 2>&1 & # 回顯啟動(dòng)信息 echo "Java application started. Check the log at $LOG_FILE"
確保將/path/to/MyApp.jar
和/path/to/MyApp.log
替換為實(shí)際的JAR文件路徑和日志文件路徑。
配置環(huán)境變量
在啟動(dòng)腳本中或在系統(tǒng)環(huán)境變量中配置必要的環(huán)境變量,如JAVA_HOME
和應(yīng)用依賴的庫路徑。
在腳本中設(shè)置環(huán)境變量
export JAVA_HOME="/usr/lib/jvm/java-8-openjdk" export PATH="$JAVA_HOME/bin:$PATH"
在系統(tǒng)環(huán)境變量中設(shè)置
- 對(duì)于Linux系統(tǒng),可以在用戶的
.bashrc
或.profile
文件中添加上述export
語句。 - 對(duì)于Windows系統(tǒng),可以通過系統(tǒng)屬性 -> 高級(jí) -> 環(huán)境變量來設(shè)置。
啟動(dòng)命令的完整示例
結(jié)合上述腳本和環(huán)境變量配置,一個(gè)完整的啟動(dòng)命令可能如下:
# 運(yùn)行啟動(dòng)腳本 ./start-app.sh
確保start-app.sh
腳本文件具有執(zhí)行權(quán)限,可以使用chmod
命令來設(shè)置:
chmod +x start-app.sh
監(jiān)控和管理運(yùn)行中的Java應(yīng)用
監(jiān)控和管理Java應(yīng)用對(duì)于確保其穩(wěn)定性和性能至關(guān)重要。
查看進(jìn)程
使用ps
命令查看Java應(yīng)用的進(jìn)程信息:
ps -ef | grep java
查看日志
檢查之前定義的日志文件以了解應(yīng)用的運(yùn)行狀況:
tail -f /path/to/MyApp.log
停止應(yīng)用
如果需要停止應(yīng)用,可以使用kill
命令結(jié)合進(jìn)程ID(PID):
kill -9 $(pgrep -f MyApp.jar)
案例源碼說明
假設(shè)我們有一個(gè)名為MyApp.jar
的Java應(yīng)用程序,我們希望在服務(wù)器上自動(dòng)啟動(dòng)它,并確保它在后臺(tái)穩(wěn)定運(yùn)行。
啟動(dòng)腳本start-app.sh
#!/bin/bash # 設(shè)置環(huán)境變量 export JAVA_HOME="/usr/lib/jvm/java-8-openjdk" export PATH="$JAVA_HOME/bin:$PATH" # 指定JAR文件和日志文件路徑 JAR_PATH="/usr/local/apps/MyApp.jar" LOG_PATH="/var/log/MyApp.log" # 啟動(dòng)Java應(yīng)用,并將輸出重定向到日志文件 nohup java -jar $JAR_PATH > $LOG_PATH 2>&1 & echo "Application started. Check logs at $LOG_PATH"
給腳本賦予權(quán)限
chmod +x start-app.sh
啟動(dòng)應(yīng)用
./start-app.sh
監(jiān)控應(yīng)用
# 查看進(jìn)程 ps -ef | grep java # 查看日志 tail -f /var/log/MyApp.log
停止應(yīng)用
kill -9 $(pgrep -f MyApp.jar)
總結(jié)
到此這篇關(guān)于linux中nohup java -jar啟動(dòng)java項(xiàng)目的文章就介紹到這了,更多相關(guān)nohup java -jar啟動(dòng)java項(xiàng)目?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Java代碼實(shí)現(xiàn)Redis和數(shù)據(jù)庫數(shù)據(jù)同步
這篇文章主要介紹了使用Java代碼實(shí)現(xiàn)Redis和數(shù)據(jù)庫數(shù)據(jù)同步問題,文中通過代碼示例給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-06-06SpringBoot項(xiàng)目使用mybatis-plus代碼生成的實(shí)例詳解
mybatis-plus是mybatis的增強(qiáng),不對(duì)mybatis做任何改變,涵蓋了代碼生成,自定義ID生成器,快速實(shí)現(xiàn)CRUD,自動(dòng)分頁,邏輯刪除等功能。本文就來講講SpringBoot項(xiàng)目如何使用mybatis-plus實(shí)現(xiàn)代碼生成,需要的可以了解一下2022-10-10Sparsearray稀疏數(shù)組原理及實(shí)例詳解
這篇文章主要介紹了Sparsearray稀疏數(shù)組原理及實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05通過端口1433連接到主機(jī)127.0.0.1的 TCP/IP 連接失敗,錯(cuò)誤:“connect timed out”的解
這篇文章主要介紹了通過端口1433連接到主機(jī)127.0.0.1的 TCP/IP 連接失敗,錯(cuò)誤:“connect timed out”的解決方法,需要的朋友可以參考下2015-08-08mybatis-plus?實(shí)現(xiàn)查詢表名動(dòng)態(tài)修改的示例代碼
通過MyBatis-Plus實(shí)現(xiàn)表名的動(dòng)態(tài)替換,根據(jù)配置或入?yún)⑦x擇不同的表,本文主要介紹了mybatis-plus?實(shí)現(xiàn)查詢表名動(dòng)態(tài)修改的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2025-03-03Java框架解說之BIO NIO AIO不同IO模型演進(jìn)之路
網(wǎng)上很多IO資料,對(duì)新手來說,越看越暈。根據(jù)自己的理解,總結(jié)對(duì)比了一下BIO、NIO、AIO,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10