说明:本篇博客篇幅较长,但其中的实质内容并不多;所以,本篇博客快速浏览为佳。
目录
一:应用服务化简介
1.为什么需要应用服务化?
2.应用服务化简介
3.应用服务化的核心命令:【systemctl】及其子指令
二:案例:CentOS中将redis配置成系统服务
1.第一步:手动启动redis,并确定redis.pid文件的存在
2.第二步:在【/usr/lib/systemd/system】目录下,创建并编写redis的服务描述文件:redis.service
3.第三步:重载【/usr/lib/systemd/system】目录下的.service,让【redis服务描述文件】生效
至此,redis的服务化,就算是设置好了;然后,我们就可以使用服务化的systemctl及其子命令,来对redis这个应用进行各种操作了。
应用服务演示一:systemctl start redis:启动redis服务
应用服务演示二:systemctl status redis:查看启动后的redis状态
应用服务演示三:systemctl stop redis:关闭redis服务
应用服务演示四:systemctl restart redis:重启redis服务
应用服务演示五:systemctl enable redis:设置redis开机自启
应用服务演示六:systemctl is-enabled redis:查看redis,是否已经设置为了自启动
验证【自启动】:设置为redis自启动后,可以shutdown -r now重启系统,验证一下
应用服务演示七:systemctl disable redis:设置redis开机不自启
验证【不自启动】:设置为redis不自启动后,可以shutdown -r now重启系统,验证一下
应用服务演示八:systemctl list-unit-files:查看当前系统中,所有的服务的当前状态
如Tomcat,redis,MySQL这种重要的中间件,就可以把其设置为系统服务,这样以后就可以借由systemctl及其子命令,对其进行统一管理,然后也可以设置其为自启动;
一:应用服务化简介
1.为什么需要应用服务化?
以为redis为例,阐述如下内容:
痛点一:在Linux系统中安装redis后,启动redis、关闭redis、重启redis,都需要去redis的源代码目录,手动去调用文件:挺麻烦的!!!
痛点二:而且,安装了redis后,我们可以通过在redis安装文件目录中,手动执行【./src/redis-server redis.conf】,去加载redis.conf,启动redis;但是,当我们关闭Linux系统或者重启Linux系统时候,redis都是自动被关闭了的;然后,如果我们还想启动redis,任然需要手动执行【./src/redis-server redis.conf】;手动启动redis,这么做当然是可以的,但是在实际中,一家公司的服务器有很多台,如果每台服务器重启后都要手动去启动redis,这个工作量太大。为此,就可以将redis进行服务化,这样以后redis就会随着系统的启动而自动启动,就不需要我们手动去启动redis了。
说白了有两个重要的痛点:(1)redis需要手动的去redis源代码目录,进行各种管理;(2)redis无法跟随Linux系统启动而自启动;
而,把redis设置成系统服务,就可以解决这个两个痛点。
……………………………………………………
2.应用服务化简介
(1)应用服务化在Windows中也存在;
(2)应用服务化的好处:通过简单的命令,就可以列出目前系统中正在运行那些服务,以及这些服务的工作状态如何,也可以通过服务管理命令对这些服务进行管理;
(3)应用服务化的核心命令:systemctl(System Control:系统控制);
● 在把一个应用设置成应用服务化的过程中,需要大量的调用systemctl命令;
● 在把一个应用设置成应用服务化的过程后,也可通过调用systemctl命令,来管理这个应用;
(4)【把一个应用程序以为服务的方式在后台运行】,也可以称作【把这个应用配置成系统服务】;
……………………………………………………
3.应用服务化的核心命令:【systemctl】及其子指令
【systemctl及其子指令】 要明确两点:
● 【在将一个应用设置成系统服务】的过程中,需要使用【systemctl及其子指令】;
● 【已经把一个应用设置成了系统服务后】,依旧可以使用【systemctl及其子指令】来管理这个应用;
systemctl是一个核心的命令,其涉及到了很多子指令:这些是在日常开发中,所使用到的systemctl的常用命指令;这些指令都是针对服务的;
二:案例:CentOS中将redis配置成系统服务
该案例以【redis的服务化设置】为例;
1.第一步:手动启动redis,并确定redis.pid文件的存在
启动redis后,确认redis是否有pid文件: 主要目的是:获取redis的pid文件的全路径
然后,这儿可以顺便看下pid文件的内容:
说明:
(1) redis的pid文件【redis_6379.pid】,是一个标识,保存的是当前进程的编号;如果,我们在redis服务化以后,在redis进行重启或者是关闭的时候,需要从redis的pid文件【redis_6379.pid】中读取进程编号,对其进行kill杀进程的操作;
(2)在确认了redis的pid文件【redis_6379.pid】的文件名和路径后,就可以进行后续的动作了;
(3)在配置redis为系统服务的过程中,是否需要在redis已经被手动启动的情况下设置,尚不明确;反正,自己在设置的时候,是在redis被手动启动的情况下设置的,然后也设置OK了;(这一点,待确认吧)。。。。。即经过实测,有一点是明确的,redis没有启动的时候,在run目录下,是没有redis_6379.pid文件;;;;;;
……………………………………………………
2.第二步:在【/usr/lib/systemd/system】目录下,创建并编写redis的服务描述文件:redis.service
切换到system目录:
cd /usr/lib/systemd/system
查看system目录下的内容;可以看到该目录下的很多文件都是.service文件,这些是服务描述文件;
在system目录下,创建redis.service:
这儿是通过vim命令直接创建的;
vim redis.service
如果想将redis进行服务化,需要在system目录中,创建一个redis的.service文件,这个.service文件的文件名就是服务名;
在redis.service中编写如下内容:
[Unit] Description=Redis After=syslog.target network.target remote-fs.target nss-lookup.target [Service] #Type=forking PIDFile=/run/redis_6379.pid ExecStart=/usr/local/redis-4.0.14/src/redis-server /usr/local/redis-4.0.14/redis.conf ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target
说明:
(1)第一个配置项[Unit]
●【Description=Redis】:这是个描述信息,来说明当前的服务是做什么的;这一项,纯粹是给读者看的;
●【After=syslog.target network.target remote-fs.target nss-lookup.target】:After是“什么什么之后的意思”,后面跟了很多系统服务;这儿的意思是,要在【syslog.target network.target remote-fs.target nss-lookup.target】这些服务启动后,才允许启动redis服务;这些服务,暂时不需要过度了解;以后,在设置其他应用程序的时候,这儿固定这样能写就行;
(2)第二个配置项【Service】
PS:这儿注释掉了,因为,我们不要在redis的服务文件中,将redis设置为默认后台运行;;;;而是后面将redis设置为系统服务后,可以通过systemctl命令,可以随时任性的设置redis是否是后台运行)●【PIDFile=/run/redis_6379.pid】:这一项指向的,就是描述redis程序进程编号的pid文件;
●【ExecStart=/usr/local/redis-4.0.14/src/redis-server /usr/local/redis-4.0.14/redis.conf】:这一项,表示服务启动时使用什么命令。这儿需要书写应用程序的完整路径;
●【ExecStop=/bin/kill -s QUIT $MAINPID】:这一项,表示关闭服务,使用什么命令。使用,kill命令,关闭指定进程,而这个进程是个$变量,其具体值来自于redis的pid文件【redis_6379.pid】中的那个进程编号;即,在实际运行时,其会把【PIDFile=/run/redis_6379.pid】中的值代入到【$MAINPID】上;【-s QUIT】表示按照正常的流程,通知指定的进程去关闭应用,以前接触过【kill -9】;-9是比较粗暴的做法,是强制的删除进程,就行是直接拔电源一样;-s是通知进程按照正常的流程进行退出;在服务关闭时,建议使用-s,但是如果入到僵尸进程或者无法正常退出的进程,就需要使用-9了;
●【PrivateTmp=true】:代表为每一个服务设置私有的Tmp临时文件目录;
(3)第三个配置项【Install】:安装的配置项
●【WantedBy=multi-user.target】:将当前redis服务,分配到multi-user.target这个服务组上;multi-user.target是系统默认的服务组,系统为这个服务组分配了一个权限,允许multi-user.target服务组中所有的服务可以随系统启动而自动启动;即,只要把一个服务分配到multi-user.target这个服务组中,那么这个服务就可以随系统启动而自动启动了;
编写好了之后,Esc退出编辑模式,然后:wq保存并退出:然后,在system目录中,就有了redis.service这个redis的服务描述文件了;
……………………………………………………
3.第三步:重载【/usr/lib/systemd/system】目录下的.service,让【redis服务描述文件】生效
使用【systemctl daemon-reload】命令,重载所有Service;
systemctl daemon-reload
……………………………………………………
至此,redis的服务化,就算是设置好了;然后,我们就可以使用服务化的systemctl及其子命令,来对redis这个应用进行各种操作了。
然后,我们就不用去redis的源代码目录,去操作redis了;也就是,经过上面的设置后,我们可以借由systemctl这个系统命令,从系统层面上对redis进行统一管理了。
……………………………………………………
进行接下来的操作前,需要把原先手动开启的redis给关掉(Ctrl+C);
……………………………………………………
应用服务演示一:systemctl start redis:启动redis服务
systemctl start redis
……………………………………………………
应用服务演示二:systemctl status redis:查看启动后的redis状态
systemctl status redis
……………………………………………………
应用服务演示三:systemctl stop redis:关闭redis服务
systemctl stop redis
……………………………………………………
应用服务演示四:systemctl restart redis:重启redis服务
……………………………………………………
应用服务演示五:systemctl enable redis:设置redis开机自启
systemctl enable redis
可以看到,在【multi-user.target】分组下增加了redis.service,然后其指向了我们编写的那个resis.service配置文件;我们将这个称为“软关联”,软关联类似于Windows中的快捷方式,即 【multi-user.target分组下的redis.service】就像是一个快捷方式,具体执行的时候,还是需要去/usr/lib/systemed/system目录下去加载redis.service;
……………………………………………………
应用服务演示六:systemctl is-enabled redis:查看redis,是否已经设置为了自启动
systemctl is-enabled redis
……………………………………………………
验证【自启动】:设置为redis自启动后,可以shutdown -r now重启系统,验证一下
……………………………………………………
应用服务演示七:systemctl disable redis:设置redis开机不自启
systemctl disable redis
然后,设置redis开机不自启后,通过【systemctl is-enables redis】命令,可以看到redis已经disabled了。
……………………………………………………
验证【不自启动】:设置为redis不自启动后,可以shutdown -r now重启系统,验证一下
……………………………………………………
应用服务演示八:systemctl list-unit-files:查看当前系统中,所有的服务的当前状态
systemctl list-unit-files
自然可以使用通道技术,筛选出目前自启动的服务:
systemctl list-unit-files | grep enabled
……………………………………………………