我们总是想着把自己的应用在系统启动时自动启动,但是我们又不会写
init.d
中的shell
脚本,所以,很多时候很无奈地只能手动。现在好了,我们有了systemd
这样的东东,我们就很容易把事情给办了。
我们先了解一下systemd
:
启动服务:
$ sudo service zookeeper start
重启服务:
$ sudo service zookeeper restart
关闭服务:
$ sudo service zookeeper stop
是不是很熟悉,看起来很不错的样子。
那么我们怎么把诸如zookeeper
这样的程序加进systemd
中呢?
首先,我们很了解一下systemd
的配置放在哪里,一般情况下会在/etc/systemd/system
中,在这个目录中,会有大量的wants
和service
。
其中wants
表示依赖的基础服务,这些我们不用去管它。
而service
则是要启动的应用服务,这些才是我们去关注的。一般情况下,每个要启动的服务都会以服务名加.service
结尾,例如:
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
的启动,所以要加这个配置,同样,这个配置也可以解决主机无法正常重启的问题。