什么是daemon与服务(service)

news2024/9/20 14:31:21

什么是daemon与服务(service)

在Linux系统中,daemon是指一类在后台运行的服务进程,通常以d结尾。它们不与用户进行交互,也不接受用户的输入,而是在系统启动时自动启动并一直运行,为操作系统、应用程序和其他服务提供支持,一些常见的daemon包括cron(定时任务守护进程)、sshd(SSH服务守护进程)、httpd(Apache Web服务器守护进程)和mysqld(MySQL服务守护进程)等。

image-20230511112534153

一般来说,当我们以命令行或图形模式进入Linux主机后,操作系统给我们提供了很多服务,比如打印服务、计划任务服务、邮件管理服务等。那么服务是如何被启动的呢?它们的工作状态是怎么样的?

system V 的init管理操作中daemon的主要分类

早期UNIX使用的是System V版本 ,在那个年代启动系统服务的管理放还是被称为 SysV的init脚本程序的处理方式。就是系统内核第一个调用的程序是init,如何init去运行所有系统所需要的服务,不论是本地服务还是网络服务。

init管理机制有如下几个特色

服务的启动、关闭于查看等方式

所有的服务启动脚本放置于/etc/init.d/ 目录,基本上都是使用bash shell所写成的脚本程序,需要启动、关闭、重新启动、查看状态时,可以通过如下的方式来处理
启动:/etc/init.d/daemon start
关闭:/etc/init.d/daemon stop
重新启动:/etc/init.d/daemon restart
查看状态:/etc/init.d/daemon status

服务的启动分类

init服务的分类中,根据服务是独立启动或被一个总管程序管理而分为两大类

独立启动模式:服务独立启动,该服务直接常驻于内存中,提供本机用户的服务操作,反应速度快
超级守护进程:由特殊的xinetd或inetd这两个总管理程序提供socket对应或端口对应的管理,当没有用户要求某socket或端口时,所需要服务不会启动,只有当用户要求时,xinetd才会去唤醒相应的服务程序。通过super daemon来执行服务的时程、连接需求等的控制。

服务的依赖性问题

服务依赖性问题就是当一个服务启动或运行需要另一个服务或资源的支持时,如果这个依赖的服务或资源>没有启动或不可用,就会导致这个服务无法启动或运行。

举个例子,如果想要启动网络服务,但是电脑系统没有网络,那么网络服务就无法启动。再比如,如果你>需要连接一个认证服务器,但是这个连接需要依赖于A服务,而A服务没有启动,那么认证服务就无法启动。在传统的init管理下,管理员需要手动处理这些依赖关系,才能启动需要的服务。但是这种方式比较繁琐容易出错。

运行级别的分类

在Linux系统中,init是系统启动后内核主动调用的程序。init可以根据用户自定义的运行级别(runlevel)来唤醒不同的服务,以进入不同的操作界面。Linux提供了7个运行级别,其中比较重要的是1、3、5。

1 是单人维护模式

3 是纯命令行模式

5 是图形界面模式
每个运行级别都有对应的启动脚本,这些脚本通过/etc/rc.d/rc[0-6]/SXXdaemon链接到/etc/init.d/daemon。其中,链接文件名(SXXdaemon)中的S表示启动该服务,XX是数字,表示启动的顺序。通过SXX的设置,启动时可以按顺序执行所有需要的服务,同时也可以解决依赖服务的问题,这点与管理员自己处理不太一样。

制定运行级别默认要启动的服务

若要建立如上提到的SXXdaemon的话,不需要手动建立链接文件,通过如下命令可以处理默认启动、默认不启动、查看默认启动与否的操作
默认要启动:chkconfig daemon on

默认不启动:chkconfig daemon off

查看默认为启动与否:chkconfig --list daemon

运行级别的切换操作

当你想从命令行界面(runlevel 3)切换到图形界面(runlevel 5)时,不需要手动启动或关闭相关服务,只需要执行命令【init 5】即可完成切换。在执行这个命令时,init会主动去分析/etc/rc.d/rc[35].d/这两个目录内的脚本,然后启动转换运行级别中需要的服务,最终完成整个运行级别的切换。这个过程中,init会自动处理服务之间的依赖关系,确保所有需要的服务都能顺利启动。

systemd使用unit分类

从Centos 7.x 以后,Red Hat系列的发行版放弃沿用多年的System V 开机启动服务的流程,就是前面提到的init启动脚本的方法,改用为systemd中启动服务管理机制。那么systemd由上面好处呢?

并行处理所有服务,加速开机流程

旧的init启动脚本是按照一定顺序依次启动各个服务的,即使某些服务不依赖其他服务也要等待前面的服务启动完成。systemd就是一种可以同时启动所有服务的初始化系统,这样可以大大缩短系统启动时间。因此,使用systemd的操作系统启动速度会更快。

一经要求旧响应的on-demand启动方式

systemd是一种新型的初始化系统,它只需要一个systemd服务和systemctl命令来管理,不需要其他额外的命令来支持。而旧的System V则需要使用init、chkconfig、service等命令来管理。此外,因为systemd常驻内存,所以可以在任何时候立即启动其他服务,而不需要等待其他服务先启动完成。这使得systemd更加高效和灵活,能够更好地处理任务。

服务依赖性的自我检查

systemd可以自定义服务之间的依赖关系,如果服务B需要在服务A启动后才能启动,但是你手动启动B服务时A服务还没有启动,systemd会自动帮助你启动A服务。这样就不需要管理员手动一个一个启动服务来满足依赖关系的要求,减轻了管理员的工作负担。

依daemon功能分类

由于systemd管理的服务非常多,为了方便管理员管理和清理所有的服务,systemd先将所有服务定义为一个服务单位(unit),然后将这些单位归类到不同的服务类型(type)中。与旧的init只分为standalone和super daemon两种类型不同,systemd将服务单位(unit)分为了多种不同类型,例如service、socket、target、path、snapshot、timer等,方便管理员进行分类和记忆。这样就更加方便管理员进行管理和维护。

将多个daemons集合成为一个群组

就像旧的System V中有多个运行级别一样,systemd将许多功能集合成一个target项目。这个项目的主要目的是为了创建操作环境,因此集成了许多daemon,执行一个target就相当于执行多个daemon。换句话说,一个target定义了一组需要启动的服务和资源,执行一个target就会启动这些服务和资源。这样就可以方便地定义和管理不同的操作环境了。

向下兼容旧的init服务脚本

基本上,systemd可以兼容旧的System V中的启动脚本,因此旧的init启动脚本也可以通过systemd来管理,只是一些高级的systemd功能旧的init没有办法支持。不过,systemd也有一些地方无法完全替换init

比如在运行级别的对应上,只有runlevel 1、3、5有对应到systemd的某些target类型,没有全部对应上。

此外,systemd的管理程序systemctl支持的语法有限制,不像旧的/etc/init.d/daemon是纯脚本可以自定义参数,systemctl不支持自定义参数。如果某些服务是管理员手动启动的,而不是使用systemctl启动,那么systemd将无法检测到该服务,也就无法进行管理。

在systemd启动过程中,无法与管理员通过标准输入传入信息,因此自行编写systemd的启动设置时,需要取消交互机制。

systemd的配置文件放置目录

systemd是一个用于Linux操作系统的系统和服务管理器,它将之前被称为“守护进程”的执行脚本统一称为“服务单位”,并按照类型进行分类,例如系统服务、socket文件服务、存储系统状态的快照类型和操作环境。
/usr/lib/systemd/system/是Linux操作系统中的一个目录,用于存储每个服务最主要的启动脚本设置。类似于以前的/etc/init.d目录下的文件。

/run/systemd/system/目录中存储的是系统执行过程中产生的服务脚本,这些脚本的优先级比/usr/lib/systemd/system/目录中的脚本要高。

/etc/systemd/system/目录用于存储管理员根据主机系统的需求建立的执行脚本。这个目录类似于以前的/etc/rc.d/rc5.d/Sxx之类的目录,执行优先级比/run/systemd/system/高

也就是说,操作系统启动是否执行某些服务是根据/etc/systemd/system/目录下的设置来决定的。该目录下面是一大堆链接文件,实际执行的systemd启动脚本配置文件都是放在/usr/lib/systemd/system/目录中。因此,如果要修改某个服务的启动设置,应该到/usr/lib/systemd/system/目录中进行修改,而/etc/systemd/system/目录只是用于链接到正确的执行脚本配置文件。所以,想要查看执行脚本设置,应该到/usr/lib/systemd/system/目录下查看。

systemd的unit类型分类说明

/usr/lib/systemd/system/ 以下的数据如何区分上述所谓不同的类型(type)呢?很简单看扩展名。举例来说,我们来看看vsftpd 启动脚本设置,还有crond与命令行模式的multi-user设置:

image-20230510202722329

所以我们知道vsftpd与crond其实算是系统服务(service),而multi-user 要算是执行环境相关的类型(target type)。根据这些扩展名的类型,大概可以找到如下几种比较常见的systemd的服务类型

扩展名主要服务功能
.service代表systemd的标准服务类型,它可以启动和管理系统进程,例如httpd.service、sshd.service等。
.socket代表systemd的socket服务类型,它可以监听指定的网络端口并转发连接请求到其他服务单元上,例如httpd.socket、sshd.socket等。
.target代表systemd的目标服务类型,它可以用于定义系统启动时要启动的服务集合,例如multi-user.target、graphical.target等。
.mount代表systemd的挂载服务类型,它可以用于管理文件系统的挂载和卸载,例如home.mount、tmp.mount等。
.automount代表systemd的自动挂载服务类型,它可以在需要时自动挂载文件系统,例如media-photos.automount。
.path代表systemd的路径服务类型,它可以在指定路径上的文件被修改时触发相应操作,例如syslog.service。
.timer代表systemd的定时器服务类型,它可以在指定的时间间隔内定期运行一个服务,例如logrotate.timer。

其中.service的系统服务类型最常见,因为我们一堆网络服务都是使用这种类型来设计的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/512382.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Julia入门-3、Julia包管理工具

文章目录 0、Julia 的包管理工具是Pkg1、使用Julia包管理工具过慢 0、Julia 的包管理工具是Pkg Julia 的包管理工具是Pkg,可以用于安装、更新、卸载和管理 Julia 中的软件包。以下是一些常用的 Pkg命令: Pkg.add("Package"):安装一…

Node.js 与 WebAssembly

目录 1、简介 2、关键概念 3、生成WebAssembly模块 4、如何使用它 5、与操作系统交互 1、简介 首先,让我们了解为什么WebAssembly是一个很棒的工具,并学会自己使用它。 WebAssembly是一种类似汇编的高性能语言,可以从各种语言编译&…

深度学习 - 47.DIN 深度兴趣网络保姆级实现 By Keras

目录 一.引言 二.DIN 模型分析 1.Input 输入 2.Embedding & Concat 嵌入与合并 3.DIN 深度兴趣网络 4.MLP 全连接 三.DIN 模型实现 1.Input 2.DIN Layer 2.1 init 初始化 2.2 build 构建 2.3 call 调用 3.Dice Layer 3.1 init 初始化 3.2 build 构建 3.3 …

网络安全:渗透神器 kali 的安装.

网络安全:渗透神器 kali 的安装. Kali Linux是一款基于Debian的Linux发行版,专门用于渗透测试和网络安全评估。它包含了大量的渗透测试工具和网络安全工具,适用于各种不同的渗透测试场景和需求。 目录: 网络安全:渗透…

MS5814可选内置基准、四通道数模转换器

MS5814/5814T 是一款 12bit 四通道输出的电压型 DAC,集成可选内部基准,接口采用四线串口模式,可以兼容 TMS320、SPI、QSPI 和 Microwire 串口。MS5814/5814T 控制数据有 16bit,包括 DAC 地址,控制字节和 12bitDAC 数据…

MySQL——BasicKnowledge

1. Mysql Version ​​​​​​​​​​​​ 2.install & uninstall 2.1 Linux My Content 3.Configure 3.1 设置IP访问 参考链接 3.1.1 方法一:改表法 --登入mysql后,更改"mysql"数据库中"user"表里的 "host&quo…

“三问五步”落地医疗行业数据安全建设体系|盾见

个 文|龚磊 2021年6月10日,我国《数据安全法》颁布,并于2021年9月1日正式施行,作为数据领域的纲领性和基础性法律,以准确定义数据、数据处理、数据安全为出发点,提出解决数据全生命周期中的数据安全问题,达…

深入浅出,理解知识图谱技术及其应用

知识图谱是一个将各种实体之间的关系以图谱的形式呈现出来的技术。这些实体可以是人、地点、组织或任何其他类型的实体。知识图谱将这些实体与它们之间的关系链接在一起,从而形成一个表示知识的图形结构。本文将介绍知识图谱的基础知识,包括它的定义、应…

【TA100】渲染管线

粗粒度剔除:根据物体之间的遮挡关系,剔除遮挡的物体。 多顶点分配到GPU不同单元执行,提升速度 1 应用阶段 1.1 场景阶段 ### 1.2 粗粒度剔除 剔除与摄像机与视锥体不相交的光源或者光线照射方向与与视角不重合的光源。 1.3 渲染设置 1.4 调用…

AVL树的插入

介绍: 在二叉搜索树的前提下,左右高度差(平衡因子)的绝对值不大于1 二叉搜索数->中序排序树->极端情况下时间复杂度高 ->我博客更过不了解去翻翻 (搜索二叉树——寻找节点,插入节点,删除节点_别想闲鱼了!快去学习的博客-CSDN博客)…

硬核推荐!3款私藏的卡通头像在线生成网站,减少撞“头”率

现在各个软件应用都会有自己的头像设置,肯定有很多朋友经常喜欢换头像,我猜大家的头像要么就是明星,要么就是网图,总是出现和别人撞“头”的现象。今天就来给大家推荐几个在线制作头像的网站,保证让撞“头”率减少90%。…

【MYSQL】聚合函数和单表/多表查询练习、子查询、内外连接

目录 1.聚合函数 1.1.group by子句 1.2.having语句 2.单表查询 2.2单表查询 3.多表查询 3.2.子查询 5.内链接 6.外连接 1.聚合函数 函数说明count返回查询到的数据的数量sum返回查询到的数据的总和avg返回查询到的数据的平均值max返回查询到的数据的最大值min返回查询…

WPF MVVM基础教程(五)RelativeSource属性绑定

RelativeSource属性绑定 介绍RelativeSource属性介绍RelativeSource的Mode属性有四种模式: 四种模式用法Self模式FindAncestor模式使用规则: TemplatedParent模式PreviousData模式 特殊用法绑定到其他ViewModel上的命令 介绍 RelativeSource 是一个标记…

前端HTML学习(二)

1、列表标签 列表标签概述:能够使用无序列表、有序列表、自定义列表标签,实现网页中列表结构的搭建。列表应用在网页中按照行展示关联性的内容,如:新闻列表、排行榜、账单等。 特点:按照行的方式,整齐显示内容 种类&a…

大模型遭泄两月后 Meta意外变赢家

一份被意外泄露的谷歌内部文件,将Meta的LLaMA大模型“非故意开源”事件再次推到聚光灯前。 “泄密文件”的作者据悉是谷歌内部的一位研究员,他大胆指出,开源力量正在填平OpenAI与谷歌等大模型巨头们数年来筑起的护城河,而最大的受…

Ae:摄像机命令

Ae 中提供了一些摄像机命令,可帮助更好地运用摄像机,比如实现跟焦、切换对焦对象(图层)、展现指定图层内容等等。 Ae菜单:图层/摄像机 Camera 这些命令也可在摄像机图层的右键菜单中选择。 基于 3D 视图生成摄像机 Cre…

MySQL基础-数据库介绍

本文介绍MySQL基础,包括什么是数据库,什么是关系型数据库,数据库和实例区别,数据库分类 文章目录 前言什么是数据库?什么是数据库管理系统(DBMS)?什么是关系型数据库管理系统&#x…

Springboot +Flowable,设置流程变量的方式(一)

一.简介 为什么需要流程变量。 举个例子,假设有如下一个流程,截图如下: 这是一个请假流程,那么谁请假、请几天、起始时间、请假理由等等,这些都需要说明,不然领导审批的依据是啥?那么如何传递…

HTML + CSS (包含移动Web) 笔记

前言 主要还是比较的一些html css&#xff1b;当然也有一些css样式时平时开发中经常用到的&#xff0c;但是我不晓得的&#xff0c;所以还是记录一下吧&#xff1b;给孩子点点关注吧&#xff01;&#x1f62d; 壹、HTML 一、标签 1.1 标题标签 块级元素 <h1> 好好…

go-micro框架-01-启动微服务及微服务间的调用

文章目录 1. 环境准备1.1 安装protoc1.2 安装 go-micro 2. 创建微服务项目2.1 创建第一个服务2.2 初始化2.3 同法再创建2个服务2.4 初始化项目 3. 微服务间调用4. 使用 consul4.1 启动consul4.2 修改代码 1. 环境准备 1.1 安装protoc https://github.com/protocolbuffers/pro…