咱們老是想着把本身的應用在系統啓動時自動啓動,可是咱們又不會寫
init.d
中的shell
腳本,因此,不少時候很無奈地只能手動。如今好了,咱們有了systemd
這樣的東東,咱們就很容易把事情給辦了。java
咱們先了解一下systemd
:redis
啓動服務:spring
$ sudo service zookeeper start
重啓服務:shell
$ sudo service zookeeper restart
關閉服務:ide
$ sudo service zookeeper stop
是否是很熟悉,看起來很不錯的樣子。spring-boot
那麼咱們怎麼把諸如zookeeper
這樣的程序加進systemd
中呢?rest
首先,咱們很瞭解一下systemd
的配置放在哪裏,通常狀況下會在/etc/systemd/system
中,在這個目錄中,會有大量的wants
和service
。日誌
其中wants
表示依賴的基礎服務,這些咱們不用去管它。code
而service
則是要啓動的應用服務,這些纔是咱們去關注的。通常狀況下,每一個要啓動的服務都會以服務名加.service
結尾,例如:ip
zookeeper.service redis.service
每一個.service
文件用來配置一個service
,它們是一個文本文件,格式爲properties
,下面就是一個zookeeper.service
的例子:
[Unit] # 服務說明 Description=zookeeper.service # 在什麼服務以後啓動 - 服務依賴 After=network.target [Service] # 服務以什麼方式啓動,若是是shell腳本的方式,則Type=forking,不然不指定做何值(也就是去掉該配置項) Type=forking # 啓動環境參數,好比說JAVA_HOME的指定,而這裏指定zookeeper的日誌目錄爲/tmp Environment=ZOO_LOG_DIR=/tmp Environment=JAVA_HOME=/usr/local/jdk18 # 動啓命令 ExecStart=/opt/zookeeper/bin/zkServer.sh start # 關閉命令 ExecStop=/opt/zookeeper/bin/zkServer.sh stop # 重啓命令 ExecReload=/opt/zookeeper/bin/zkServer.sh restart [Install] WantedBy=multi-user.target
好,如今咱們把這個.service
文件放進/etc/systemd/system
中,而後咱們還要告訴systemd
咱們加入了新的service
:
$ sudo systemctl daemon-reload
若是要隨系統自動啓動,則還要加入下面的命令讓systemd
知道要自動啓動該service
:
# 注意,須要在服務名後加.service後綴 $ sudo systemctl enable zookeeper.service
固然你也能夠關閉隨系統啓動這個功能:
$ sudo systemctl disable zookeeper.service
好,自此,你的service
就加入到systemd
中了,niubility吧?哈哈。
哦,若是是spring-boot
這樣的貨呢?怎麼搞?
spring-boot
官網的方法是搞不定的,至少我是搞不定,老是啓動不起來,就只好用最原始的方法,本身寫.service
配置,這裏貼一份個人配置文件,以供參考:
[Unit] Description=service.infrastructure # 設定在zookeeper啓動以後再啓動 After=zookeeper.service [Service] User=kut ExecStart=/usr/bin/java -Dspring.profiles.active=development -jar /home/kut/service-infrastructure-provider-1.0.jar SuccessExitStatus=143 [Install] WantedBy=multi-user.target
整個配置重點在After
配置這裏,由於我使用的是dubbo
,dubbo
依賴於zookeeper
的啓動,因此要加這個配置,一樣,這個配置也能夠解決主機沒法正常重啓的問題。