我们知道,在我们登陆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管理服务。而在传统的systemV类型的init进程中使用多个指令管理服务,比如service、setup、chkconfig等指令来管理服务的启动、关闭、默认启动。

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

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

通过上一小节我们知道,服务也是有很多类型的,比如有service、target等类型;而每种类型的服务使用的命令command是不一定相同。比如service服务类型的命令start/stop/restart命令不能够作为target服务类型的命令,在后面需要着重注意。

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

由于服务也是一个进程,因此我们可以使用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-units与list-unit-files来观察了!详细用法如下:

格式

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

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

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

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

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

在管理操作环境之前我们需要知道系统上有哪些关于操作环境的服务呀,操作环境的服务的扩展名为target,因此我们可以使用上一小节的知识查看有哪些操作环境相关的服务。

格式:

  systemctl  list-unit-files --type=target  //列出所有扩展名为target的服务

有两个很重要的操作环境服务:multi-user.target与graphical.target。

管理操作环境(切换、设置)

对于target类型的服务才能使用以下命令,并且target类型的服务使用service类型服务的某些命令是无效的。比如start/stop/restart。

常用的切换与设置操作环境的操作命令:

systemctl isolate graphical.target  //在不重新开机的情况下立刻将Linux系统切换至图形界面模式

systemctl isolate multi-user.target  //在不重新开机的情况下立刻将Linux系统切换至命令行模式

systemctl set-default multi-user.target  //在下一次及以后开机启动的时候默认进入图形界面的模式

systemctl get-default  //获得系统当前的登录模式(图形界面或命令行)对应服务名称

4.通过systemctl分析各服务之间的相依性

实例

  systemctl  list-dependencies  //列出当前操作环境(命令行或图形界面)的相依性;即显示default.target可能会唤醒哪些服务

  systemctl  list-dependencies  multi-user.target  //列出 multi-user.target为根的树形相依性;即显示multi-user.target可能会唤醒的服务

  systemctl  list-dependencies  multi-user.target   --reverse  //显示multi-user.target可能会被哪些服务唤醒

 实例讲解

systemctl list-dependencies,下图显示default.target可能会唤醒哪些服务

systemctl  list-dependencies  multi-user.target   --reverse,下图显示multi-user.target可能会被哪些服务唤醒

5.与systemd的daemon运行过程相关的目录简介

socket服务相关文件的位置:

我们知道systemd中有很多机会会使用到socket服务,因此可能会产生很多的socket文件;那如何知道这些socket文件放置在哪呢?可以使用systemctl list-sockets指令查看。

这样就很清楚的知道socket的文件放在哪了。

网络服务与端口号

指令:

  cat  /etc/services  //查看网络服务对应的端口号

网络服务与端口号之间的关系以表格的形式被存储在/etc/services文件中。

/etc/services文件内容如下所示:显示了服务名与对应的端口号

6.网络服务

什么是网络服务? 会产生一个网络监听端口的程序称为网络服务。

网络服务默认由SELinux管理,但是我们也可以使用systemctl来管理。因此这里使用systemctl来管理网络服务。

查看系统开启了多少个网络服务:netstat

格式:

  netstat  -tunlp  //显示当前正在进行监听的网络服务

各个选项具体的含义请参考Linux系列(16)之系统资源的观察。

关闭网络服务

格式:

  systemctl  stop  服务名.扩展名    //关闭某个网络服务

5.systemctl执行例行性任务

在使用比较老旧的systemV类型的init进程时,都是通过crond服务配合crontab指令来进行创建例行性调度工作的。但是现在我们的系统上使用的是更新的systemd类型的init进程,因此我们可以通过systemd服务来管理各种例行性调度的工作。

下面就来了解一下关于systemd服务中关于例行调度的内容timer。

1.timer相比crond的优缺点

优点:

缺点:systemd的timer并没有email通知功能,而crond有email通知功能。

crond例行性工作调度的最小时间单位为分钟(minute);而systemd的timer例行性工作调度的最小时间单位可以精确到秒(second)甚至毫秒(millisecond)。

6.centOS7.x的服务简要说明

1.默认启动的服务

以上服务开机就会自动启动。

2.需要手动启动的服务

有的服务不一定安装了,因此有的需要先安装。

以上服务需要自己通过systemctl指令或者service指令启动。

启动服务格式

  systemctl  start  服务名  //启动服务

  service start  服务名  //启动服务

Linux系列(17)之系统服务的更多相关文章

  1. Linux系列(14)之工作管理

    1.工作管理 说明:工作管理(job control)是用在bash环境下的,也就是说:“当我们登录系统取得bash shell之后,在单一终端机接口下同时进行多个工作的行为管理”.举例说明,我们在登 ...

  2. 学习Linux系列--安装Ubuntu

    最近学习Linux,使用虚拟机太不方便,于是购买了阿里云最便宜的云主机作为学习设备. 本系列文章记录了个人学习过程的点点滴滴. 学习Linux系列--安装Ubuntu 学习Linux系列--安装软件环 ...

  3. kali Linux系列教程之BeFF安装与集成Metasploit

    kali Linux系列教程之BeFF安装与集成Metasploit 文/玄魂 kali Linux系列教程之BeFF安装与集成Metasploit 1.1 apt-get安装方式 1.2 启动 1. ...

  4. Kali linux系列之 zmap 安装

    Kali linux系列之 zmap 安装 官方文档地址:https://zmap.io/ 准备:保证有比较顺畅的更新源,可以更新系统,下载安装包. 安装 第一步:sudo apt-get insta ...

  5. [Linux] PHP程序员玩转Linux系列-使用supervisor实现守护进程

    1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...

  6. Linux系列:Fedora虚拟机设置固定IP上网(配置IP、网关、DNS、防止resolv.conf被重写)

    首先声明:该方法在Fedora 17和18版本下有效,其它版本也许可行也许有所差异. 1.  虚拟机相关配置 如果不是虚拟机系统,则这步不需要,若是相关配置详细信息请看“Linux系列:Ubuntu虚 ...

  7. Linux Mint 17使用小结

    用过蛮多的linux系统 linux mint是我比较喜欢和常用的一个系统,装的是linux mint xfce 64位版本,在这里记录使用中遇到的一些问题及解决的方法,备忘,方便以后查看. 1.首先 ...

  8. 跟着鸟哥学Linux系列笔记3-第11章BASH学习

    跟着鸟哥学Linux系列笔记0-扫盲之概念 跟着鸟哥学Linux系列笔记0-如何解决问题 跟着鸟哥学Linux系列笔记1 跟着鸟哥学Linux系列笔记2-第10章VIM学习 认识与学习bash 1. ...

  9. 跟着鸟哥学Linux系列笔记2-第10章VIM学习

    跟着鸟哥学Linux系列笔记0-扫盲之概念 跟着鸟哥学Linux系列笔记0-如何解决问题 跟着鸟哥学Linux系列笔记1 常用的文本编辑器:Emacs, pico, nano, joe, vim VI ...

随机推荐

  1. linux下设置git代理访问.

    有时候克隆仓库巨慢无比,需要设置代理. 一般情况下 proxychains 可以搞定的. 但是某些情况,如go 安装模块的时候是调用git的.这个时候proxchains就不行了. go 也可以通过设 ...

  2. vue中父组件如何监听子组件值的变化

    vue中我们会遇到很多父子组件通信的需求, 下面简单列一下,父子组件通信的几种情况 1:父组件向子组件传值:使用prop向子组件传值: 2:子组件实时监听父组件传来的值的变化:使用watch去监听父组 ...

  3. 求ascii 然后做运算

    介绍 ABC 返回每个字符的ascii A->65 B->66 C->77 组成656667 把所有的7替换成1 然后变成 656667 和 656661 每个数值做加法 然后做减法 ...

  4. Redis启动后基础只是讲解

    1.单进程 epoll是Linux内核为处理大批量文件描述符而作了改进的epoll,是Linux下多路复用IO接口select/poll的增强版本, 它能显著提高程序在大量并发连接中只有少量活跃的情况 ...

  5. Docker安装mysql5.6

    1.docker hub 上查找mysql镜像 2.在docker hub上(阿里云加速器)拉取mysql镜像到本地标签为5.6 3.使用mysql5.6创建容器(也叫运行镜像) 4.交互运行,进入m ...

  6. 算法-java实现

    1. 质因数分解 public static List<Integer> factorize(int n){ List<Integer> factors = new Array ...

  7. 我用asp.net core 部署到docker遇到的问题

    1.怎么部署 我是用文件的形式先发布出来,然后把文件拷贝到服务器上部署到docker中去. 2.端口映射 根据查找到的资料,dockerfile 是不支持指定映射服务器端口的,只能在run的时候用-p ...

  8. 通过generate解析SQL日志生成xml进行SQL回放

    查看Oracle redo日志来分析SQL执行记录 1)设置Oracle数据字典导出路径参数(可选) shutdown immediatealter system set UTL_FILE_DIR=' ...

  9. 使用es6一句话去重

    let arr = [1,2,3,4,5,1,2,3] let arr2 = Array.from(new Set(arr)) console.log(arr2) //[1,2,3,4,5]

  10. [ML] Linear Discriminant Analysis

    虽然名字里有discriminat这个字,但却是生成模型,有点意思. 判别式 pk 生成式 阅读:生成方法 vs 判别方法 + 生成模型 vs 判别模型 举例: 判别式模型举例:要确定一个羊是山羊还是 ...