哈喽大家好,我是咸鱼。
我们知道 CentOS 7 之后,Systemd 代替了原来的 SystemV 来管理服务,相比 SystemV ,Systemd 能够很好地解决各个服务间的依赖关系,还能让所有的服务同时启动,而不是串行启动。
通常情况下,yum 安装的软件会由系统的包管理器(如 RPM)安装,并且会配置相应的 systemd 服务,因此由 systemd 来管理。然而,在一些情况下,特别是当采用源码编译安装软件或者软件本身并没有提供 systemd 管理的解决方案时,就需要手动编写 systemd 服务文件(service 文件)来管理这些软件。
那今天我们就来看看手动编写 systemd 服务文件来管理软件时发现的一些问题。
问题出现
我们的 zookeeper 是通过源码编译来安装,为了方便管理,决定改成通过 systemd 来管理。
下面是 zookeeper 的 service 文件
# zookeeper
[Unit]
Description=Zookeeper
After=network.target
[Service]
Type=forking
ExecStart=/opt/zookeeper/bin/zkServer.sh start
ExecStop=/opt/zookeeper/bin/zkServer.sh stop
PIDFile=/var/lib/zookeeper/zookeeper_server.pid
[Install]
WantedBy=multi-user.target
可以看到,配置文件分成几个区块,每个区块包含若干条键值对。
[Unit]
Unit
部分的 Description
字段给出当前服务的简单描述接下来的设置是启动顺序:
After
字段:表示zookeeper.service
应该在哪些服务之后启动。Before
字段,表示zookeeper.service
应该在哪些服务之前启动。
注意,After
和Before
字段只涉及启动顺序,不涉及依赖关系。
[Service]
Service
部分定义如何启动当前服务。
-
ExecStart
:启动进程时执行的命令。 -
ExecStop
:停止服务时执行的命令。 -
Type
:定义启动类型- simple(默认值):
ExecStart
字段启动的进程为主进程 - forking:
ExecStart
字段将以fork()
方式启动,此时父进程将会退出,子进程将成为主进程 - oneshot:类似于
simple
,但只执行一次,Systemd 会等它执行完,才启动其他服务 - dbus:类似于
simple
,但会等待 D-Bus 信号后启动 - notify:类似于
simple
,启动结束后会发出通知信号,然后 Systemd 再启动其他服务 - idle:类似于
simple
,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合
- simple(默认值):
[Install]
Install
部分定义如何安装这个配置文件,即怎样做到开机启动
WantedBy
:表示该服务所在的 Target。
Target
的含义是服务组,表示一组服务。WantedBy=multi-user.target
指的是,kafka 和 zookeeper 所在的 Target 是 multi-user.target
。
这个设置非常重要,因为执行systemctl enable
命令时,zookeeper .service
的一个符号链接,就会放在/etc/systemd/system
目录下面的multi-user.target.wants
子目录之中。
Systemd 有默认的启动 Target。
[root@localhost ~]# systemctl get-default
multi-user.target
上面的结果表示,默认的启动 Target 是 multi-user.target
。在这个组里的所有服务,都将开机启动。这就是为什么 systemctl enable
命令能设置开机启动的原因。
编写好 service 文件之后,我们执行下面的命令来启动 zookeeper:
[root@localhost ~]# systemctl start zookeeper.service
接着看下 zookeeper 的运行状态
[root@localhost ~]# systemctl status zookeeper.service
● zookeeper.service - Zookeeper
Loaded: loaded (/usr/lib/systemd/system/zookeeper.service; enabled; vendor preset: disabled