第十七章 认识系统服务 (daemons)

文章目录

什么是daemon与服务(service)

服务是功能的体现。daemon是实现服务的进程。通常不用将二者做详细区分。daemon是一个程序执行后的程序,daemon本身这个程序的命名通常是在服务的名称后加d。这个d是daemon的意思。

早期的system V的 init管理行为中的主要分类(Optional)

system V是Unix的旧版本。当时,用SysV的init脚本程序启动系统服务。系统首先调用的程序是init,再由init去唤醒其他服务。

init的管理机制的特点:
1.对服务的操作有:启动,关闭,重启,状态观察。所有服务启动脚本都在/etc/init.d目录下。命令格式如下:

/etc/init.d/daemon  command #command 可以是start/stop/restart/status。分别对应启动/关闭/重启/状态观察

2.服务启动的方式分为独立启动(stand alone)和被一个总管程序(super daemon)管理。前置服务独立启动,且该服务常驻内存,反应速度快。后者由xinetd/inetd这种总管程序提供socket对应或port对应的管理。用户由请求时,由总管程序唤醒相应的服务程序。缺点是唤醒服务慢。
3.服务的相依性:服务的实现常常需要其他服务的支持。inti再管理员手动处理某服务时,无法协助唤醒支持它的服务。
4.执行等级分类:开机内核调用init,后init据用户自订的使用等级(runlevel)来唤醒不同的服务,以进入不同的操作界面。Linux有7个执行等级(0~6)。1是单人维护模式、3是纯文本模式、5是文字加图形界面模式。

不同执行等级的启动脚本是通过 /etc/rc.d/rc[0-6]/SXXdaemon 链接到 /etc/init.d/daemon ,链接文件名 (SXXdaemon)的意义为:S为启动该服务,XX是数字,为启动的顺序。由于有 SXX 的设置,因此在开机时可以“依序执行”所有需要的服务, 同时也能解决相依服务的问题。这点与管理员自己手动处理不同。
5.制定执行等级默认要启动的服务:若要创建SXXdaemon文件,则不用管理员手动创建链接文件。可执行以下指令:

chkconfig daemon on/off  #默认启动/不启动
chkconfig daemon --list daemon  #观察默认为启动否

6.runlevel的切换:从纯命令行(runlevel 3)切换到图形界面(runlevel 5),执行“init 5”即可关闭原来服务,打开runlevel5所需的服务。

systemd使用的unit分类

从CentOS 7.x后,用init启动脚本来启动其他服务的方式被systemd这个启动服务管理机制代替。systemd的优点如下
1.同时处理所有服务,开机快:init 启动脚本即使对不相依的服务也是“一项一项任务依序启动”的。当os和硬件支持多核心架构时,systemd让所有服务同时启动的方式自然更快。
2.一经要求就回应的 on-demand 启动方式: 整个systemd 仅由一个systemd 服务配合 systemctl 指令来处理,指令不再繁杂。且systemd由于常驻内存,因此任何要求 (on-demand) 都可以立即处理后续的 daemon 启动的任务。
3.服务相依性的自我检查和自动启动:systemd会自动启动服务的支撑服务。
4.依据daemon对服务分类:systemd将每个daemon执行脚本称为一个服务单位(unit),每个unit根据功能归入不同的类型(type)。类别有:系统服务(service)、数据监听与交换的插槽档服务 (socket)、储存系统状态的快照类型(snapshot)、提供不同类似执行等级分类的操作环境 (target),path,timer等类型。(类似独立服务与总管程序的分类)
5.将多个 daemons 集合成为一个群组:systemd 将许多的功能集合成为一个target 项目。1个target==许多daemon。(类似runlevel)
6.向下相容旧有的 init 服务脚本:init 启动脚本也能够通过 systemd 来管理。

init中systemd无法取代的部分:
只有执行等级1,3,5可以在systemd的某些target类型中有对应;
一个管理程序systemctr管理全部的systemd,systemctr不可自订参数,支持的语法有限制(命令形式不够多样);
不是用systemctr启动的服务,systemd无法检测到;
systemd 启动过程中,无法与管理员过 standard input 传入讯息!因此,自行撰写systemd 的启动设置时,务必要取消互动机制(连通过启动时传进的标准输入讯息也要避免!)!!!
systemd 的配置文件所在目录 .

/usr/lib/systemd/system/  #服务的启动脚本设置。类似/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/ 存链接文件,决定开机后执行哪些服务。不重要。
/usr/lib/systemd/system/  关系到某个服务启动时的设置。用于查看和修改。

systemd的unit类型分类说明
执行以下命令查看/usr/lib/systemd/system/下文件类型。

ll /lib/systemd/system #查看此配置文件下的详细内容。
可以用cat命令前往此路径,再用ls命令查看。安装的服务和系统已有的服务在此路径下均可以看到。

注意:由于文件夹的合并问题。有些配置文件路径不对。如/usr/lib/systemd/system/实际在/lib/systemd/system/下。详见:Ubuntu下文件夹合并说明
常见的systemd服务类型(可根据服务的后缀名区分)如下:

扩展名 主要服务功能
.service 一般服务类型 (service unit):主要是系统服务,包括服务器本身所需要的本机服务以及网络服务都是!最常见。
.socket 内部程序数据交换的插槽服务 (socket unit):主要是 IPC (Interprocess communication) 的传输讯息插槽档 (socket file) 功能。这种类型的服务通常在监控讯息传递的插槽档,当有通过此插槽档传递讯息来说要链接服务时,就依据当时的状态将该用户的要求传送到对应的daemon, 若 daemon 尚未启动,则启动该 daemon 后再传送用户的要求。
.target 执行环境类型 (target unit):其实是一群 unit 的集合。, 选择执行xxx.target 就是执行一堆其他 .service 或/及 .socket 之类的服务
.amount .automount 文件系统挂载相关的服务 (automount unit / mount unit):例如来自网络的自动挂载、NFS 文件系统挂载等与文件系统相关性较高的程序管理。
.path 侦测特定文件或目录类型 (path unit):某些服务(如打印服务)需要侦测某些特定的目录来提供伫列(队列)服务
.timer 循环执行的服务 (timer unit):类似 anacrontab ,不过是由 systemd 主动提供的,比 anacrontab 更加有弹性!

通过systemctl管理服务

systemd 这个启动服务的机制,主要是通过一个名为 systemctl 的指令来处理的!

通过systemctl管理单一服务(service unit)的启动/开机启动与观察状态

服务的启动分为两个阶段:开机的时候设置要不要启动这个服务,现在要不要启动这个服务。二者差别很大。

systemctl [command] unit  #命令格式

注意服务的权限:关闭打开服务有时需要加sudo提高权限。

command可以是:
start :立刻启动后面接的unit
stop :立刻关闭后面接的unit
restart :立刻关闭后启动后面接的unit,亦即执行 stop 再 start 的意思
reload :不关闭后面接的 unit 的情况下,重新载入配置文件,让设置生效
enable :设置下次开机时,后面接的unit会被启动
disable :设置下次开机时,后面接的unit不会被启动
status :目前后面接的这个 unit 的状态,会列出有没有正在执行、开机默认执行否、登录等信息等!
is-active :目前有没有正在运行中
is-enable :开机时有没有默认要启用这个 unit

示例:查看服务状态。
第十七章 认识系统服务 (daemons)

第二,三行很重要
Loaded:说明开机时这个unit会不会启动。enabled时启动,disabled相反。是紧跟服务名后面的那个。
	daemon的其他默认状态:除eabled/disabled外。有
	static:这个 daemon 不可以自己启动(enable 不可),不过可能会被其他的enabled的的服务来唤醒(相依属性的服务)
	mask:这个daemon 无论如何都无法被启动!因为已经被强制注销(非删除)可通过systemctl unmask 方式改回原本状态
	
Active:当前这个unit的状态是正在执行(running)或没有执行(dead)。
	Active参数说明:
	running:有一个或多个程序正在执行。
	exited:仅执行一次就正常结束的服务,当前系统无任何程序执行(如的 quotaon 功能)。
	waiting:正在执行当中,不过还再等待其他的事件才能继续理
	inactive:这个服务目前没有运行的意思
	
以时间开头的行显示:登录时间,登录主机等信息。

注:不应该使用 kill 的方式来关掉一个正常的服务,否则 systemctl 会无法继续监控该服务的!
注意:系统没有的服务,安装时一定要把名字弄对。如atd.service。和后缀说明服务类型时系统服务,但安装命令为

sudo apt install at #若at写成atd或者atd.service则安装失败。
然而,安装服务cups的命令为
sudo apt install cups

综上安装服务不可加后缀名,有时可能要去d*。

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

插系统上有多少服务命令如下

systemctl [command] [--type=TYPE] [--all] #命令格式
	list-unit-files :依据 /usr/lib/systemd/system/ 内的文件,将所有文件列表说明。
	--type=TYPE:就是之前提到的 unit type,主要有 service, socket, target 等
systemctl  #列出系统上面 启动的unit。按pgup,pgdn换页。
systemctl list-unit-files #列出所有安装的unit
systemctl list-units --type=service --all #列出所有*.service服务。

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

列出与操作界面关系较大的target项目

systemctl list-units --type=target --all

结果如下
第十七章 认识系统服务 (daemons)

图片说明:
以下是两个最常用的模式。
graphical.target:就是文字加上图形界面模式,此项目包含了下面的 multi-user.target项目!
multi-user.target:纯文本模式!

获取和修改当前模式

 systemctl [command] [unit.target] #命令格式
选项与参数:
command可以是:
get-default :取得目前的target
set-default :设置后面接的target成为默认的操作模式
isolate :切换到后面接的模式

模式及切换命令

 systemctl poweroff 系统关机
 systemctl reboot 重新开机
 systemctl suspend 进入暂停模式
 systemctl hibernate 进入休眠模式
 systemctl rescue 强制进入救援模式
 systemctl emergency 强制进入紧急救援模式
suspend:暂停模式会将系统的状态数据保存到内存中,然后关闭掉大部分的系统硬件,但未真正关机,唤醒很快。
hibernate:休眠模式则是将系统状态保存到硬盘当中,保存完毕后,将计算机关机。唤醒速度与硬盘性能有关。

上一篇:C++开源库 - 包管理工具Vcpkg安装使用教程


下一篇:arm linux添加自启动脚本