Linux基础篇-第十七章-认识系统服务 (daemons)

2021-08-17  本文已影响0人  Js_Gavin

指令

systemctl

systemctl [command] [unit] :控制systemd系统和服务(单一服务的启动/关闭/观察)
      command 主要有:
            start :立刻启动后面接的 unit
            stop :立刻关闭后面接的 unit
            restart :立刻关闭后启动后面接的 unit,亦即执行 stop 再 start 的意思
            reload :不关闭后面接的 unit 的情况下,重载配置文件,让设定生效
            enable :设定下次开机时,后面接的 unit 会被启动
            disable :设定下次开机时,后面接的 unit 不会被启动
            status :目前后面接的这个 unit 的状态,会列出有没有正在执行、开机预设执行否、登录等信息等!
            is-active :目前有没有正在运作中
            is-enable :开机时有没有预设要启用这个 unit

systemctl [command] [--type=TYPE] [--all] :观察系统上所有的服务
      command 主要有:
            list-units :依据 unit 列出目前有启动的 unit。若加上 --all 才会列出没启动的。
            list-unit-files :依据 /usr/lib/systemd/system/ 内的文件,将所有文件列表说明。
            --type=TYPE:就是之前提到的 unit type,主要有 service, socket, target 等

systemctl [command] [unit.target] :管理不同的操作环境
      command:
             get-default :取得目前的 target
             set-default :设定后面接的 target 成为默认的操作模式
             isolate :切换到后面接的模式

systemctl list-dependencies [unit] [--reverse] :分析各服务之间的相依性
      --reverse :反向追踪谁使用这个 unit 的意思!

systemctl daemon-reload :重载 systemd 的脚本配置文件内容

systemctl poweroff 系统关机

systemctl reboot 重新启动

systemctl suspend 进入暂停模式

systemctl hibernate 进入休眠模式

systemctl rescue 强制进入救援模式

systemctl emergency 强制进入紧急救援模式

systemd 的配置文件放置目录

基本上, systemd 将过去所谓的 daemon 执行脚本通通称为一个服务单位 (unit),而每种服务单位依据功能来区分时,就分类为不同的类型 (type)。 基本的类型有包括系统服务、数据监听与交换的插槽档服务 (socket)、储存系统状态的快照类型、提供不同类似执行等级分类的操作环境 (target) 等等。 这么多类型,那设定时会不会很麻烦呢?其实还好,因为配置文件都放置在底下的目录中:

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

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

  3. /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) 呢?很简单!看扩展名!

image.png

透过 systemctl 管理服务

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

一般来说,服务的启动有两个阶段,一个是『开机的时候设定要不要启动这个服务』, 以及『你现在要不要启动这个服务』,这两者之间有很大的差异!举个例子来说,假如我们现在要『立刻取消 atd 这个服务』时,正规的方法 (不要用 kill) 要怎么处理

查看状态
image.png
关闭服务,并查看状态
image.png

systemctl status atd.service 的第三行,不是有个 Active 的 daemon 现在状态吗?除了 running 跟 dead 之外, 有没有其他的状态呢?有的~基本上有几个常见的状态:

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

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

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

  4. inactive:这个服务目前没有运作的意思。

既然 daemon 目前的状态就有这么多种了,那么 daemon 的预设状态有没有可能除了 enable/disable 之外,还有其他的情况呢?当然有!

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

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

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

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

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

上一小节谈到的是单一服务的启动/关闭/观察,以及相依服务要注销的功能。那系统上面有多少的服务存在呢?这个时候就得要透过 list-units 及 list-unit-files 来观察了!

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

在我们的 CentOS 7.1 的预设情况下,就有 26 个 target unit 耶!而跟操作界面相关性比较高的
target 主要有底下几个:

  1. graphical.target:就是文字加上图形界面,这个项目已经包含了底下的 multi-user.target 项目!

  2. multi-user.target:纯文本模式!

  3. rescue.target:在无法使用 root 登入的情况下,systemd 在开机时会多加一个额外的暂时系统,与你原本的系统无关。这时你可以取得 root 的权限来维护你的系统。但是这是额外系统,因此可能需要动到 chroot 的方式来取得你原有的系统!再后续的章节我们再来谈!

  4. emergency.target:紧急处理系统的错误,还是需要使用 root 登入的情况,在无法使用 rescue.target 时,可以尝试使用这种模式!

  5. shutdown.target:就是关机的流程。

  6. getty.target:可以设定你需要几个 tty 之类的,如果想要降低 tty 的项目,可以修改这个东西的配置文件!

正常的模式是 multi-user.target 以及 graphical.target 两个,救援方面的模式主要是 rescue.target 以及更严重的 emergency.target。 如果要修改可提供登入的 tty 数量,则修改 getty.target 项目。基本上,我们最常使用的当然就是 multi-user 以及 graphical。

正常的切换情况下,使用上述 isolate 的方式即可。不过为了方便起见, systemd 也提供了数个简单的指令给我们切换操作模式之用! 大致上如下所示:

image.png

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

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

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

透过 systemctl 分析各服务之间的相依性

略......

与 systemd 的 daemon 运作过程相关的目录简介

比较重要的 systemd 启动脚本配置文件在 /usr/lib/systemd/system/, /etc/systemd/system/ 目录下,那还有哪些目录跟系统的 daemon 运作有关呢? 基本上是这样的:

  1. /usr/lib/systemd/system/
    使用 CentOS 官方提供的软件安装后,默认的启动脚本配置文件都放在这里,这里的数据尽量不要修改~要修改时,请到 /etc/systemd/system 底下修改较佳!
  2. /run/systemd/system/
    系统执行过程中所产生的服务脚本,这些脚本的优先序要比 /usr/lib/systemd/system/ 高!
  3. /etc/systemd/system/
    管理员依据主机系统的需求所建立的执行脚本,其实这个目录有点像以前 /etc/rc.d/rc5.d/Sxx 之类的功能!执行优先序又比 /run/systemd/system/ 高!
  4. /etc/sysconfig/*
    几乎所有的服务都会将初始化的一些选项设定写入到这个目录下,举例来说,mandb 所要更新的 man page 索引中,需要加入的参数就写入到此目录下的 man-db 当中!而网络的设定则写在 /etc/sysconfig/network-scripts/ 这个目录内。所以,这个目录内的文件也是挺重要的;
  5. /var/lib/
    一些会产生数据的服务都会将他的数据写入到 /var/lib/ 目录中。举例来说,数据库管理系统 Mariadb 的数据库默认就是写入 /var/lib/mysql/ 这个目录下!
  6. /run/
    放置了好多 daemon 的暂存档,包括 lock file 以及 PID file 等等

systemctl 针对 service 类型的配置文件

systemctl 配置文件相关目录简介

现在我们知道服务的管理是透过 systemd,而 systemd 的配置文件大部分放置于 /usr/lib/systemd/system/ 目录内。但是 Red Hat 官方文件指出, 该目录的文件主要是原本软件所提供的设定,建议不要修改!而要修改的位置应该放置于 /etc/systemd/system/ 目录内。举例来说,如果你想要额外修改 vsftpd.service 的话, 他们建议要放置到哪些地方呢?

  1. /usr/lib/systemd/system/vsftpd.service:官方释出的预设配置文件;

  2. /etc/systemd/system/vsftpd.service.d/custom.conf:在 /etc/systemd/system 底下建立与配置文件相同文件名的目录,但是要加上 .d 的扩展名。然后在该目录下建立配置文件即可。另外,配置文件最好附档名取名为 .conf 较佳! 在这个目录下的文件会『累加其他设定』进入 /usr/lib/systemd/system/vsftpd.service 内!

  3. /etc/systemd/system/vsftpd.service.wants/*:此目录内的文件为链接档,设定相依服务的连结。意思是启动了 vsftpd.service 之后,最好再加上这目录底下建议的服务。

  4. /etc/systemd/system/vsftpd.service.requires/*:此目录内的文件为链接档,设定相依服务的连结。意思是在启动 vsftpd.service 之前,需要事先启动哪些服务的意思。

systemctl 配置文件的设定项目简介

image.png

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

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

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

  3. [Install]:这个项目就是将此 unit 安装到哪个 target 里面去的意思!

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

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

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

  3. 空白行、开头为 # 或 ; 的那一行,都代表批注!
    每个部份里面还有很多的设定细项,我们使用一个简单的表格来说明每个项目好了!

image.png

接下来了解一下在 [Service] 当中有哪些项目可以使用!

image.png image.png

最后,再来看看那么 Install 内还有哪些项目可用?

image.png

自己的服务自己作

我们来模拟自己作一个服务吧!假设我要作一只可以备份自己系统的服务,这只脚本我放在 /backups底下,内容有点像这样:

[root@study ~]$ vim /backups/backup.sh

#!/bin/bash
source="/etc /home /root /var/lib /var/spool/{cron,at,mail}"
target="/backups/backup-system-$(date +%Y-%m-%d).tar.gz"
tar -zcvf ${target} ${source} &> /backups/backup.log

[root@study ~]$ chmod a+x /backups/backup.sh
[root@study ~]$ ll /backups/backup.sh
-rwxr-xr-x. 1 root root 220 Aug 13 01:57 /backups/backup.sh
# 记得要有可执行的权限才可以!

接下来,我们要如何设计一只名为 backup.service 的启动脚本设定呢?可以这样做

[root@study ~]$ vim /etc/systemd/system/backup.service
[Unit]
Description=backup my server
Requires=atd.service
[Service]
Type=simple
ExecStart=/bin/bash -c " echo /backups/backup.sh | at now"
[Install]
WantedBy=multi-user.target
# 因为 ExecStart 里面有用到 at 这个指令,因此, atd.service 就是一定要的服务!

[root@study ~]# systemctl daemon-reload
[root@study ~]# systemctl start backup.service
[root@study ~]# systemctl status backup.service
backup.service - backup my server
 Loaded: loaded (/etc/systemd/system/backup.service; disabled)
 Active: inactive (dead)
Aug 13 07:50:31 study.centos.vbird systemd[1]: Starting backup my server...
Aug 13 07:50:31 study.centos.vbird bash[20490]: job 8 at Thu Aug 13 07:50:00 2015
Aug 13 07:50:31 study.centos.vbird systemd[1]: Started backup my server.
# 为什么 Active 是 inactive 呢?这是因为我们的服务仅是一个简单的 script 啊!
# 因此执行完毕就完毕了,不会继续存在内存中!

systemctl 针对 timer 的配置文件

有时候,某些服务你想要定期执行,或者是开机后执行,或者是什么服务启动多久后执行等等的。在过去,我们大概都是使用 crond 这个服务来定期处理, 不过,既然现在有一直常驻在内存当中的 systemd 这个好用的东西,加上这 systemd 有个协力服务,名为 timers.target 的家伙,这家伙可以协助定期处理各种任务!那么,除了 crond 之外,如何使用 systemd 内建的 time 来处理各种任务呢?这就是本小节的重点

任务需求

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

  1. 系统的 timer.target 一定要启动
  2. 要有个 sname.service 的服务存在 (sname 是你自己指定的名称)
  3. 要有个 sname.timer 的时间启动服务存在

sname.timer 的设定值

你可以到 /etc/systemd/system 底下去建立这个 *.timer 档,那这个文件的内容要项有哪些东西呢?基本设定主要有底下这些: (man systemd.timer & man systemd.time)

image.png

使用于 OnCalendar 的时间

如果你想要从 crontab 转成这个 timer 功能的话,那么对于时间设定的格式就得要了解了解~基本上的格式如下所示:

image.png

上面谈的是基本的语法,你也可以直接使用间隔时间来处理!常用的间隔时间单位有:

  1. us 或 usec:微秒 (10-6 秒)
  2. ms 或 msec:毫秒 (10-3 秒)
  3. s, sec, second, seconds
  4. m, min, minute, minutes
  5. h, hr, hour, hours
  6. d, day, days
  7. w, week, weeks
  8. month, months
  9. y, year, years

常见的使用范例有:

image.png

此外,你也可以使用英文常用的口语化日期代表,例如 today, tomorrow 等!假设今天是 2015-08-13 13:50:00 的话,那么

image.png

CentOS 7.x 预设启动的服务简易说明

略......

总结

  1. 早期的服务管理使用 systemV 的机制,透过 /etc/init.d/*, service, chkconfig, setup 等指令来管理服务的启动 /关闭/预设启动;

  2. 从 CentOS 7.x 开始,采用 systemd 的机制,此机制最大功能为平行处理,并采单一指令管理 (systemctl),开机速度加快!

  3. systemd 将各服务定义为 unit,而 unit 又分类为 service, socket, target, path, timer 等不同的类别,方便管理与维护

  4. 启动/关闭/重新启动的方式为: systemctl [start|stop|restart] unit.service

  5. 设定预设启动/预设不启动的方式为: systemctl [enable|disable] unit.service

  6. 查询系统所有启动的服务用 systemctl list-units --type=service 而查询所有的服务 (含不启动) 使用 systemctl list-unit-files --type=service

  7. systemd 取消了以前的 runlevel 概念 (虽然还是有兼容的 target),转而使用不同的 target 操作环境。常见操作环境为 multi-user.targer 与 graphical.target。 不重新启动而转不同的操作环境使用 systemctl isolate unit.target,而设定预设环境则使用 systemctl set-default unit.target

  8. systemctl 系统默认的配置文件主要放在 /usr/lib/systemd/system,管理员若要修改或自行设计时,则建议放在 /etc/systemd/system/ 目录下。

  9. 管理员应使用 man systemd.unit, man systemd.service, man systemd.timer 查询 /etc/systemd/system/ 底下配置文件的语法, 并使用 systemctl daemon-reload 加载后,才能自行撰写服务与管理服务!

  10. 除了 atd 与 crond 之外,可以 透过 systemd.timer 亦即 timers.target 的功能,来使用 systemd 的时间管理功能。

  11. 一些不需要的服务可以关闭!

上一篇下一篇

猜你喜欢

热点阅读