Linux系统服务

梦想与她 提交于 2019-12-15 18:49:39

(整理自《鸟哥的Linux私房菜》基础篇)

 

1.systemd 使用的 unit 分类

1.1   systemd 的配置文件放置目录

systemd 将过去所谓的 daemon 执行脚本通通称为一个服务单位 (unit),而每种服务单位依据功能来区分时,就分类为不同的类型 (type)。几个比较重要的目录:

•        /usr/lib/systemd/system/:每个服务最主要的启动脚本设定,有点类似以前的 /etc/init.d 底下的文件;

•        /run/systemd/system/:系统执行过程中所产生的服务脚本,优先序要比 /usr/lib/systemd/system/ 高;

•        /etc/systemd/system/:依据主机系统需求所建立的执行脚本,优先序又比/run/systemd/system/ 高。

•        /etc/sysconfig/*:几乎所有的服务都会将初始化的一些选项设定写入到这个目录下,举例来说,网络的设定则写在/etc/sysconfig/network-scripts/ 这个目录内。

•        /var/lib/:一些会产生数据的服务都会将他的数据写入到 /var/lib/ 目录中。

•        /run/:放置了好多 daemon 的缓存文件,包括 lock file 以及 PID file 等 。

1.2  systemd 的 unit 类型分类说明

常见的 systemd 的服务类型如下:

扩展名

主要服务功能

.service

一般服务类型 (service unit):主要是系统服务,包括服务器本身所需要的本地服务以及网络服务,比较经常被使用到的服务大多是这种类型。

.socket

内部程序数据交换的插槽服务 (socket unit):主要是 IPC的传输讯息socket文件功能。 这种类型的服务通常在监控讯息传递的socket文件,当有透过此socket文件传递讯息来说要链接服务时,就依据当时的状态将该用户的要求传送到对应的 daemon, 若 daemon 尚未启动,则启动该 daemon 后再传送用户的要求。使用 socket 类型的服务一般是比较不会被用到的服务。

.target

执行环境类型 (target unit):其实是一群 unit 的集合,例如上面表格中谈到的 multi-user.target 其实就是一堆服务的集合,也就是说, 选择执行 multi-user.target 就是执行一堆其他 .service 或/ 及 .socket 之类的服务!

.mount

.automount

文件系统挂载相关的服务 (automount unit / mount unit):例如来自网络的自动挂载、NFS 文件系统挂载等与文件系统相关性较高的程序管理。

.path

检测特定文件或目录类型 (path unit):某些服务需要检测某些特定的目录来提供队列服务,例如最常见的打印服务,就是透过检测打印队列目录来启动打印功能。

.timer

循环执行的服务 (timer unit):这个东西有点类似 anacrontab,不过是由 systemd 主动提供的,比 anacrontab 更加有弹性。

 

2.通过 systemctl 管理服务

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

一般来说,服务的启动有两个阶段,一个是『开机的时候设定要不要启动这个服务』, 另一个是『你现在要不要启动这个服务』

举个例子来说,假如我们现在要『立刻取消 atd 这个服务』时,正规的方法 (不用 kill) 要怎么处理?

 

 

 

 如上,如果我们使用 kill 的方式来关掉一个正常的服务的话,systemctl 是会无法继续监控该服务的。所以最好不要使用kill来关闭一个正常的服务。

 

active基本上有几个常见的状态:

•        active (running):正有一个或多个程序正在系统中执行,举例来说,正在执行中的 vsftpd 就是这种模式。

•        active (exited):仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行。 举例来说,开机或者是挂载时才会进行一次的 quotaon 功能,就是这种模式! quotaon 不须一直执行,只须执行一次之后,就交给文件系统去自行处理,通常用 bash shell 写的小型服务,大多是属于这种类型 (无须常驻内存)。

•        active (waiting):正在执行当中,不过还再等待其他的事件才能继续处理。举例来说,打印的队列相关服务就是这种状态。 虽然正在启动中,不过也需要真的有队列进来 (打印作业) 这样他才会继续唤醒打印机服务来进行下一步打印的功能。

•        inactive:目前没有运作。

 

daemon 的预设的几种常见状态:

•        enabled:这个 daemon 将在开机时被执行

•        disabled:这个 daemon 在开机时不会被执行

•        static:这个 daemon 不可以自己启动 (不可enable ),不过可能会被其他的 enabled 的服务来唤醒 (相依属性的服务)

•        mask:这个 daemon 无论如何都无法被启动!因为已经被强制注销 (非删除)。可以通过 systemctl unmask 方式改回原本状态。

 

§  强迫服务注销 (mask)

比较正规的作法是:要关闭 cups.service 时,连同其他两个会唤醒 service 的 cups.socket 与cups.path 一起关闭! 比较不正规的作法是:强迫 cups.service 注销,通过 mask 的方式来将这个服务注销:

 

 

 

 那如何取消注销:

 

 

 

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

系统上面有多少的服务存在?这个时候就得要通过 list-units 及 list-unit-files 来观察了, 具体的用法如下:

 

 

 

使用 systemctl list-unit-files 会将系统上所有的服务通通列出来,而不像 list-units 仅以 unit 分类作大致的说明。 至于 STATE 状态就是开机是否会加载的那个状态项目,主要有 enabled / disabled / mask / static 等。

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

列出跟操作界面比较有关的 target 项目:

 

 

 

 如何知道目前的界面模式是哪一种?又得要如何修改呢:

 

 

 

 此外, systemd 还提供了几个简单的指令给我们切换操作模式:

 

 

 关机、重新启动、救援与紧急模式这没啥问题,那么什么是暂停与休眠模式呢?

•        suspend:暂停模式会将系统的状态数据保存到内存中,然后关闭掉大部分的系统硬件,当然,并没有实际关机! 当用户按下唤醒机器的按钮,系统数据会重内存中回复,然后重新驱动被大部分关闭的硬件,就开始正常运作!唤醒的速度较快。

•        hibernate:休眠模式则是将系统状态保存到硬盘当中,保存完毕后,将计算机关机。当用户尝试唤醒系统时,系统会开始正常运作, 然后将保存在硬盘中的系统状态恢复回来。因为数据是由硬盘读出,因此唤醒的效能与你的硬盘速度有关。

 

3.systemctl 配置文件的设定

瞧一瞧 sshd.service 的内容:

 

 

 分析上面的配置文件,大概能够将整个设定分为三个部份,就是:

•        [Unit]: unit 本身的说明,以及与其他相依 daemon 的设定,包括在什么服务之后才启动此 unit 之类的设定值;

•        [Service], [Socket], [Timer], [Mount], [Path]..:不同的 unit type 就得要使用相对应的设定项目。我们拿的是 sshd.service 来当模板,所以这边就使用 [Service] 来设定。 这个项目内主要在规范服务启动的脚本、环境配置文件档名、重新启动的方式等等。

•        [Install]:这个项目就是将此 unit 安装到哪个 target 里面的!

至于配置文件内有些设定规则还是得要说明一下:

•        设定项目通常是可以重复的,例如我可以重复设定两个 After 在配置文件中,不过,后面的设定会取代前面的!因此,如果你想要将设定值归零, 可以使用类似『 After= 』的设定,亦即该项目的等号后面什么都没有,就将该设定归零了 (reset)。

•        如果设定参数需要有『是/否』的项目 (布尔值, boolean),你可以使用 1, yes, true, on 代表启动,用 0, no, false, off 代表关闭!

•        空白行、开头为 # 或 ; 的那一行,都代表批注!

 

4 systemctl 针对 timer 的配置文件

基本上,想要使用 systemd 的 timer 功能,你必须要有几个要素:

•        系统的 timer.target 一定要启动

•        要有个 sname.service 的服务存在 (sname 是你自己指定的名称)

•        要有个 sname.timer 的时间启动服务存在

设定值有:

[Timer] 部份

设定参数

参数意义说明

OnActiveSec

当 timers.target 启动多久之后才执行这只 unit

OnBootSec

当开机完成后多久之后才执行

OnStartupSec

当 systemd 第一次启动之后过多久才执行

OnUnitActiveSec

这个 timer 配置文件所管理的那个 unit 服务在最后一次启动后,隔多久后再执行一次的意思

OnUnitInactiveSec

这个 timer 配置文件所管理的那个 unit 服务在最后一次停止后,隔多久再执行一次的意思。

OnCalendar

使用实际时间 (非循环时间) 的方式来启动服务的意思!至于时间的格式后续再来谈。

Unit

一般来说不太需要设定,因此如同上面刚刚提到的,基本上我们设定都是 sname.server + sname.timer,那如果你的 sname 并不相同时,那在 .timer 的文件中, 就得要指定是哪一个 service unit !

Persistent

当使用 OnCalendar 的设定时,指定该功能要不要持续进行的意思。通常是设定为 yes ,比较能够满足类似 anacron 的功能!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!