Linux系列(17)之系统服务

我们知道,在我们登陆Linux后,系统就为我们提供了很多服务,比如例行工作调度服务crond、打印服务、邮件服务等。那么这些服务是如何被启动的呢?

这个问题先放一下,接下来我们先了解一下Linux的启动过程。

1.Linux系统启动过程

启动过程分为5个阶段:内核引导、运行init进程、系统初始化、建立终端、用户登录系统。

1.内核引导

当计算机打开电源以后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动。操作系统接管硬件以后,首先读入/boot目录下的内核文件。

 2.运行init

init进程是系统所有进程的起点。如果没有这个进程,系统中的任何进程都不会启动。 init进程首先会去读取配置文件。

init的任务就是运行这些daemon

init的类型:

运行级别

 3.系统初始化

在init的配置文件中调用并执行了/etc/rc.d目录下的rc.sysinit脚本文件。

主要工作是:激活交换分区、检查磁盘、加载硬件模块以及执行一些优先任务。

 用户可以通过chkconfig或setup中的“system services”来设定每个运行级别中将运行哪些守护进程daemon(就是服务)。

4.建立终端

5.用户登录

有三种登录方式:命令行登录、ssh登录、图形界面登录。

2.systemd服务管理机制

在centOS7.x之后,Linux放弃了沿用多年的SystemV这个开机启动流程,改用systemd这个启动服务管理机制。

1.systemd的优点

《1》一经要求就立刻响应的on-demand启动方式:systemd服务只有一个与之搭配的指令systemctl。

《2》依daemon功能分类:systemd管理的服务非常多,为了区分各种服务的功能,systemd将每个服务定义为一个服务单位unit,并将unit归类到不同的服务类型(type)当中去。systemd将服务单位(unit)区分为service、socket、target、path、snapshot、timer等,方便管理员分类与记忆。

《3》向下兼容旧的init服务脚本。

2.systemd的配置文件放置目录

 服务的启动脚本配置文件:/usr/lib/systemd/system/

系统执行产生的服务脚本:/run/systemd/system/

管理员创建的执行脚本:/etc/systemd/system/

 3.服务类型

 我们可以通过这些配置文件的扩展名确定服务的类型,每一个文件代表一个服务,文件名(去掉扩展名)就是服务(进程)的名称

 4.管理服务

systemd类型的init进程只有一个指令systemctl管理服务。

服务的启动分为两种类型:开机启动、“当前”启动。

这两种类型的启动是有很大区别的

1.管理单一服务的启动与开机启动和状态观察

由于服务也是一个进程,因此我们可以使用kill来管理这个服务,但是存在弊端,如果使用kill杀死一个服务,那么systemctl将无法继续监控该服务;因此我们这里使用systemctl来管理。

unit由两部分组成:服务名、扩展名。

服务单位unit是有类型区分的,区分的办法就是在服务后面添加格式;比如系统服务atd的unit是atd.service,比如target类型服务multi-user的unit是multi-user.target

当我们要管理一个服务时,但是我们仅仅知道服务名(通过top查询服务名),却不知道扩展名该怎么办?

我们可以查看systemd的配置文件/usr/lib/systemd/system,通过配置文件的扩展名从而可以确定服务的扩展名

实例1:

  查看atd这个服务的状态

 Loaded与Active这两行的信息非常重要,告诉我们该服务是不是开机自启,以及当前状态。

服务默认状态分类(在Loaded行的红线处显示):

daemon的默认状态除了enable和disable之外,还有其他类型:

《1》static:这个服务不可以自己启动,但是可能被其他的enable类型的服务唤醒(相依属性的服务)。

《2》mask:这个服务无论如何都不会被启动!因为已经被强制注销(非删除),可通过systemctl unmask方式改回原本状态。

服务当前状态分类(在Active行冒号后的第一个单词显示):

《1》active (running):表示正有一个或多个程序正在系统中执行。

《2》active (exited):表示仅执行一次就正常结束的服务。

《3》active (waiting):表示正在执行当中,不过还在等待其他的事情才能继续处理。

《4》inactive:表示这个服务目前没有运行。

关闭服务

实例1.关闭chronyd.service服务

先通过systemctl status chronyd.service查看状态,如果服务未关闭,则使用systemctl stop chronyd.service关闭服务,再使用systemctl disable chronyd.service取消开机时自动启动该服务。

上述关闭有一个问题,就是如果这个服务存在属性相依的服务B,那么服务B有可能会重新唤醒这个服务。

关闭属性相依服务A的正规做法:

 如果你关闭的服务A,A有个与其属性相依的服务B,这就表明这个服务A可能被属性相依的服务B自动唤醒;因此当你想要彻底关闭这个服务时,你需要将属性相依的服务B也关闭

 关闭属性相依服务A的不正规做法:

使用systemctl mask A强迫服务注销

格式:

systemctl mask unit  //unit由服务名与类型扩展名组成

例如system mask atd.service

当你强迫服务注销之后,你是无法启动这个服务了,除非使用systemctl unmask atd.service取消注销。

2.通过systemctl观察系统上所有服务

上一小节讲述的是单一服务的启动、关闭、观察,以及相依服务要注销的功能。那系统上有多少服务存在呢?这就需要通过list-unitslist-unit-files来观察了!详细用法如下:

格式

 systemctl   //等同于systemctl list-units,列出系统上面有启动的unit

systemctl  --all  //列出所有的unit(包含启动的与未启动的)

systemctl list-unit-files  //将所有安装的unit列出来,安装的都会在/usr/lib/systemd/system/目录下有相应的文件

其他的格式可以依上图查询。

3.通过systemctl管理不同的操作环境(target unit)

猜你喜欢

转载自www.cnblogs.com/z-x-p/p/11643280.html