1.何为系统服务(daemon)
在之前章节的学习中,我们学习过linux系统的【service】,【service】在linux系统中是“常驻在系统内存中且可以提供一些系统或网络功能的进程”,而如果要想提供一个服务,那就必须要有能够提供服务运行的程序,这个程序,我们就可以称为【daemon】。
没有【daemon】,就没有【service】,我们也不需要刻意的去区分【daemon】与【service】。
通常我们使用命令【ps -la】查看进程时,经常会看到名字结尾是d的进程,这个d代表的就是【daemon】的意思,代表一个服务
2.daemon服务类型的分类
systemd将每个daemon视作一个服务单位(unit),而每个服务单位(unit)根据提供服务功能的区别,又可以分成多个类型的服务。
systemed启动脚本的配置文件位于【/usr/lib/systemd/system】目录之中。

我们通过查看这个目录内的文件的名字,我们可以看出这些文件的后缀名都有些许的不同,通过这些脚本文件的后缀名,我们可以知道这些服务脚本提供的服务的类型
(1)扩展名:.service
一般服务类型(service unit),主要是系统服务,包括服务器本身所需要的本地服务以及网络服务等,经常被使用到的服务多数是这种类型
例如:atd.service、brandbot.service
(2)扩展名:.socket
用于程序内部之间的数据交换,相当于提供一个数据交换窗口,这种类型的服务通常在监控信息传递的socket文件中,当通过此socket文件传递信息要链接服务时,就根据当时的状态将该用户的要求传送到对应的daemon,若daemon未启动,则启动该daemon之后再传送用户的要求
例如:avahi-daemon.socket
(3)扩展名:.target
执行环境的类型(target unit),属于界面类型的服务,其实是一群unit的集合,例如命令行界面的multi.-user.target,和图形化界面的graphical.target,选择执行其中一个target,就等同于同时执行了一堆其他的.service或.socket服务
(4)扩展名:.mount、.automount
文件系统挂载相关的服务,例如来自网络的自动挂载,NFS文件系统的挂载等与文件系统相关性较高的进程管理
(5)扩展名:.path
检测特定文件或目录类型(path unit),某些服务需要检测特定的目录来提供队列服务,例如在常见的打印服务,就是通过检测打印队列目录来启动打印功能,这时需要.path的服务类型支持
(6)扩展名:.timer
循环执行的任务(time unit),这个服务有点类似anacrontab,不过由systemd提供,使用起来比anacrontab灵活
3.通过systemctl管理服务
(1)操控服务的命令
通过systemctl命令,我们可以人工来控制服务的启停及查看服务的状态
命令格式:systemctl 【command】 【服务名】
例如:systemctl start firewalld
常用命令参数:
start:开启服务
stop:终止服务
restart:重启服务
reload:让服务重新加载配置文件
enable:设置服务开机启动
disable:禁止服务开机启动
mask:强制注销某个服务,使其无法被唤醒(启动)
unmask:取消注销某个服务,恢复可以被启动的状态
status:查看当前服务的运行状态

(2)服务状态参数分析
我们先使用systemctl status atd命令查看atd服务的当前状态

依据图中所示,我们重点的观察对象在第二行(Loaded)和第三行(Active)
其中【Loaded】行告诉了我们当前服务能否开机启动,【enable】表示可以开机启动;【diable】表示无法开机启动;【static】当前服务无法开机自行启动,但是可以通过别的服务来进行唤醒;【mask】当前服务已被注销,无法进行自启动及被动唤醒
而【Active】行则告诉了我们当前服务的运行状态
【active(running)】:当前服务正在正常运行
【active(exited)】:仅执行一次就正常结束的服务,通常小程序bash都是这种状态,无须常驻与内存中
【active(waiting)】:服务正在正常运行,不过在等待其他事件发生才继续运行,例如打印服务,虽然正处于运行状态,但是也需要输入打印信息之后才会唤醒打印服务(类似于监听状态)
【inactive(dead)】:当前服务没有在运行中

(3)查看当前系统的服务
可以通过【systemctl】命令来查看当前系统上的所有服务,或者是进行某个服务的查询
命令格式:systemctl 【command】 【--type=TYPE】【--all】
例如:systemctl list-unit-files --type=service --all

常用参数解释:
【command】
list-units:依据unit显示目前有启动的unit,后续加上--all代表演示所以启动及未启动的unit,默认情况下直接输入【systemctl】就等于是输入【systemctl list-units】
list-unit-files:列出当前系统unit的开机启动状态

【--type=TYPE】:TYPE为unit的类型,根据上边我们所学的后缀分类,这里为:service、socket、target等
例如:systemctl --type=target
(4)通过systemctl切换不同的操作环境
通过【systemctl --type=target】,我们可以查看当前系统上正在启动的所有与操作环境相关的target服务

其中我们最常用的就是【multi-user.target】命令行界面,和【graphical.target】图形化界面
此外【rescue.target】【emergency.target】是用于系统出现错误时候的修复模式
【getty.target】是登录tty界面的设置,如果想降低tty的数量,可以修改这个配置文件
命令格式:systemctl 【command】【unit.target】
例如:systemctl get-default
常用参数:
get-default:查看当前的target

set-default:设置后续的target为默认的操作模式,重启后生效
例如:systemctl set-default graphical.target
isolate:直接切换到后边的操作环境
例如:systemctl isolate multi-user.target
这里要记住,service服务用的命令是start、stop这些,但是操作环境需要使用的是【isolate】,因为是要隔离操作环境嘛
除此之外,systemctl还为我们提供了直接切换模式的命令
【systemctl poweroff】:系统关机
【systemctl reboot】:重启系统
【systemctl suspend】:进入挂起模式(睡眠模式,数据保留在内存中)
【systemctl hibernate】:进入休眠模式(数据保留在硬盘中)
【systemctl rescue】:进入恢复模式
【systemctl emergency】:进入紧急恢复模式
4.通过systemctl分析服务之间的依赖性
我们通过上边的学习可以得知,系统的服务之间是存在着一个依赖性的,那我们如果想查询某个服务用到了那些依赖,或某个服务被什么东西所依赖的话,可以如何查询?
这时候我们依旧要使用到【systemctl】命令
命令格式:systemctl list-dependencies 【服务名】 【--reverse】
例如:systemctl list-dependencies multi-user.target (查看multi-user.target依赖什么服务)

--reverse:表示查看这个服务被哪些服务所依赖
例如:systemctl list-dependencies multi-user.target --reverse

从图中我们可知,multi-user.target这个命令行模式是graphical这个图形化模式的依赖
5.与systemd的服务运行过程相关的目录简介
与systemd的daemon配置相关的文件目录如下:
/usr/lib/systemd/system:使用Centos官方提供的软件安装后,默认的启动脚本配置文件都在这个目录下
/run/systemd/system:系统执行过程中所产生的服务脚本
/etc/systemd/system:管理员依据主机系统的需求所建立的执行脚本
/etc/sysconfig/*:几乎所有的服务都会将初始化的一些选项设置写入到这个目录中,例如DNS等相关网络参数的参数就放置在【/etc/sysconfig/network-scripts/*】中
例如:cat /etc/sysconfig/network-scripts/ifcfg-eth0

/var/lib:一些会产生数据的服务都会将它的数据写入到【/var/lib】目录中,例如数据库MariaDB的数据默认就会写入到【/var/lib/mysql/】这个目录中
/etc/services(重要):这个文件记录了系统中各个服务对应的网络端口号

Comments NOTHING