前言
你是如何啟動、關閉你的SpringBoot項目的?還是使用java -jar xxxx.jar啟動?
還在用ps -ef找到你的pid去kill你的應用嗎?
讓我們來看看還有什么更加優雅的一鍵啟動關閉的方式。
第一種方式
使用shell腳本,就是編寫相應的shell腳步去啟動和關閉我們的項目。
腳本內容:https://github.com/LinkinStars/springBootTemplate/blob/master/app.sh
PS:本人不是專業運維,可能shell腳本不夠規范,見諒~~
腳本的使用
首先,將你需要發布的jar包,和含有上述內容的腳本app.sh,上傳至linux服務器,注意兩者必須處於同一目錄,並且該目錄下只有一個jar包,並給與app.sh相應執行權限,chmod 777 app.sh
然后就可以執行腳本,命令如下
命令 | 作用 |
---|---|
./app.sh start | 啟動應用 |
./app.sh stop | 關閉應用 |
./app.sh restart | 重啟應用 |
./app.sh status | 查看應用狀態 |
./app.sh stop -f | 強制kill應用進程 |
注意,重新發布應用時,先stop再上傳jar包哦。
使用情況如圖:

腳本中可以修改的地方:
19行左右: nohup java -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -Xms512M -Xmx4G -jar $appName > /dev/null 2>&1 &
這是最終jar的啟動命令,在這里你需要對gc、Xms、Xmx等針對你機器的實際情況修改,還可以添加你所需要的啟動參數等。
56行左右: for i in {3..1}
這里是設置restart的時候等待的時間,因為有的項目在3秒之內可能沒有辦法正常停止,所以可以調整為5秒,保證應用確實正常停止后再啟動
第二種方式
如果你以為這樣就足夠優雅了,那你就太天真了,如果你使用的是SpringBoot2.0及以上的版本,那就有福了,不需要腳本也可以很優雅。
如何使用
首先你修改一下打包的方式:
如果你使用gradle構建的項目,在build.gradle文件中加入以下代碼,打包時使用bootJar進行打包
bootJar {
launchScript()
}
如果你使用maven進行構建的項目,添加下面的代碼
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <executable>true</executable> </configuration> </plugin>
打出來的jar文件非常神奇,在linux系統可以直接使用./app.jar這樣類似於啟動shell腳本一般的方式啟動項目,你可以先嘗試一下是否能這樣啟動,來保證后續步驟的正常。
第二步添加鏈接
在服務器上運行下面的命令:
$ sudo ln -s /var/myapp/myapp.jar /etc/init.d/myapp
其中【/var/myapp/myapp.jar】為你上傳至服務器jar的絕對路徑,一定要寫全哦。
【/etc/init.d/myapp】里面的myapp可以修改為你自己想要的名稱,后面會用到。
第三步啟動
做完之后,你就可以使用service命令,像啟動停止服務一樣操作你的應用:
$ service myapp start
$ service myapp stop
$ service myapp status
測試效果如下:
[root@localhost ~]# service myapp start
Started [31624]
[root@localhost ~]# service myapp status
Running [31624]
[root@localhost ~]# service myapp stop
Stopped [31624]
其中會遇到的坑:
使用service myapp start命令后可能出現Unable to find Java.
使用ln -s /usr/local/jdk/bin/java /sbin/java命令來解決。
其中【/usr/local/jdk/bin/java】為你安裝在服務器上jdk的目錄
【/sbin/java】不需要修改
問題解決參考:https://github.com/spring-projects/spring-boot/issues/5690
總結
這樣之后你想停止應用,不需要再像以前一樣ps -ef找來找去了。
這對於之后的CICD,或者是docker化的你的應用等,都有一定的幫助。
參考博客:
https://segmentfault.com/a/1190000012030747
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#deployment-install