3、Spring Boot之使用init.d啓動jar

1.springboot啓動方式

springboot的程序包支持如下兩種方式啓動:

  • java -jar
  • 可執行文件(./jar)

Linux中支持將可執行文件以init.d和systemd的方式啓動,以init.d或systemd的啓動方式比java -jar啓動更有優勢:

  • 啓動的時候會判斷是否已經啓動成功
  • 停止的時候能確保停止
  • 支持start|stop|force-stop|restart|force-reload|status|run等initd.d的服務命令選項

我們生產環境的系統都爲centos,且大部分機器centos版本都爲6.*,不支持systemd,所以統一使用init.d的方式啓動。

2.pom配置

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <executable>true</executable>
            </configuration>
        </plugin>
    </plugins>
</build>

3.conf配置

默認下,jar包會讀取同目錄下相同文件名.conf文件中的配置信息。

1).目錄結構

[root@*-*-* deploy]# ll
total 30096
-r-------- 1 root root     1396 May 10 18:32 springboot-admin-0.0.1-SNAPSHOT.conf
-r-x------ 1 root root 30813005 May 10 18:03 springboot-admin-0.0.1-SNAPSHOT.jar

2).conf配置信息

JAVA_HOME="/usr/local/java/jdk1.8.0_71"
JAVA_OPTS="-server
 -Xms1G
 -Xmx1G
 -XX:+DisableExplicitGC
 -verbose:gc
 -Xloggc:/data/springboot-admin/10037/logs/gc.%t.log
 -XX:+PrintHeapAtGC
 -XX:+PrintTenuringDistribution
 -XX:+PrintGCApplicationStoppedTime
 -XX:+PrintGCTaskTimeStamps
 -XX:+PrintGCDetails
 -XX:+PrintGCDateStamps
 -XX:PermSize=128m
 -XX:MaxPermSize=128m
 -XX:NewRatio=4
 -XX:SurvivorRatio=8
 -XX:TargetSurvivorRatio=90
 -XX:MaxTenuringThreshold=8
 -XX:+UseCMSInitiatingOccupancyOnly
 -XX:CMSInitiatingOccupancyFraction=70
 -XX:ParallelGCThreads=19
 -XX:ConcGCThreads=19
 -XX:-UseGCOverheadLimit
 -XX:+UseParNewGC
 -XX:+UseConcMarkSweepGC
 -XX:CMSFullGCsBeforeCompaction=1
 -XX:+CMSParallelRemarkEnabled
 -XX:+CMSScavengeBeforeRemark
 -XX:+ParallelRefProcEnabled
 -XX:+UseCMSCompactAtFullCollection
 -XX:CMSMaxAbortablePrecleanTime=6000
 -XX:CompileThreshold=10
 -XX:MaxInlineSize=1024
 -Dsun.net.client.defaultConnectTimeout=60000
 -Dsun.net.client.defaultReadTimeout=60000
 -Dnetworkaddress.cache.ttl=300
 -Dsun.net.inetaddr.ttl=300
 -Djsse.enableCBCProtection=false
 -Djava.security.egd=file:/dev/./urandom
 -Dlog.console.level=off
 -Dlog.root.level=warn
 -Dlog.path=/data/springboot-admin/10037/logs
 -Dlog4j2.DiscardThreshold=INFO
 -Dlog4j2.AsyncQueueFullPolicy=Discard"
RUN_ARGS="-Dspring.profiles.active=test"
LOG_FOLDER=/data/springboot-admin/10037/logs

4.註冊及運行腳本

[root@* deploy]# chmod 400 springboot-admin-0.0.1-SNAPSHOT.conf 
[root@* deploy]# chmod 500 springboot-admin-0.0.1-SNAPSHOT.jar 
ln -s /data/springboot-admin/10037/deploy/springboot-admin-0.0.1-SNAPSHOT.jar /etc/init.d/springboot-admin
[root@* deploy]# service springboot-admin start
Started [16299]
[root@* deploy]# service springboot-admin restart
Stopped [16299]
Started [16544]
[root@* deploy]# service springboot-admin stop
Stopped [16544]

5.添加啓動項

chkconfig --add springboot-admin
==

6.探究

通過查看springboot源碼,實現方式主要是給jar包了層啓動腳本,該腳本源碼在spring-boot-tools/spring-boot-loader-tools下的launch.script文件中,可以通過bash -x來查看腳本的執行過程。

bash -x /data/springboot-admin/10037/deploy/springboot-admin-0.0.1-SNAPSHOT.jar

stop和force_stop的區別是一個是kill,另一個是kill -9。

  • kill 向進程發送SIGTERM信號,類似於Ctrl+C的效果
  • kill -9 向進程發送是SIGKILL,即exit。exit信號不會被系統阻塞
    PS:使用stop某些特殊情況下可能無法完全停止

7.權限

在Spring Boot的啓動腳本中,假如jar包對應的擁有者是user1,那麼執行service springboot-admin start時,會使用user1賬號啓動該服務及對應的jar包

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章