系统为了某些功能必须要提供一些服务(无论是系统本身还是网络方面),这个服务就称为 service,但是 service 的提供总是需要程序的运行,而完成这个 service 的程序就称为:守护进程(daemon)。比如说:完成周期性计划任务服务的程序为 crond
这个就可以称为 daemon。
事实上,可以将这两者视为相同的东西,因为完成某个服务就需要一个 daemon 在后台运行,没有这个 daemon 就不会有 service,所以不需要分得太清楚
在 Linux 中,通常在服务的名称之后会加上一个
d
,例如计划任务命令建立的at
与cron
这两个服务,它们的程序分别取名为atd
与crond
,而这个d
就代表daemon
的意思。
1 Systemd
的介绍
从 CentOS 7.x 以后,Red Hat 系列的发行版使用了 Systemd
这个 启动服务管理机制。它的好处有:
- 并行处理所有服务,加速开机流程
- 一经要求就响应的
on-demand
启动方式 - 服务依赖性的自我检查
- 依 daemon 功能分类。为了梳理清楚所有服务的功能,
systemd
先定义所有服务为一个服务单位(unit
),并将该unit
归类到不同的服务类型(type
)中,systemd
将服务单位(unit
)区分为:service
、socket
、target
、path
、snapshot
、timer
等多种不同的类型,其实所谓的 daemon 执行脚本即为一个服务单位(unit) - 将多个 daemon 集合称为一个群组,
systemd
将许多功能集合称为一个所谓的target
项目,这个相思木主要在设计操作环境的创建,即执行某个target
就是执行多个 daemon 的意思 - 向下兼容旧有的
init
服务脚本
systemd
的配置文件都放置在下面的目录中:
/usr/lib/systemd/system/
:每个服务主要启动的脚本设置/run/systemd/system/
:系统执行过程中所产生的服务脚本,这些脚本的优先级比/usr/lib/systemd/system/
的要高/etc/systemd/system
:管理员根据主机系统的需求所建立的执行脚本,这些脚本的优先级比/run/systemd/system/
的要高
以下是几种常见的 systemd
的服务类型:
.service
:一般服务类型,主要是系统服务,包括服务器本身所需要的本地服务以及网络服务等,是最常用的类型.soceket
:内部程序数据交换的 socket 服务.target
:执行环境类型,其实就是一群unit
的集合.mount
/.automount
:文件系统挂载相关的服务,如来自网络的自动挂载,NFS 文件系统挂载等与文件系统相关性较高的进程管理.path
:检测特定文件或目录类型.timer
:循环执行的服务
2 通过 systemctl
管理服务
基本上,systemd
这个启动服务的机制,主要是通过一个名为 systemctl
的命令来完成。
2.1 管理单一服务的启动、开机启动与查看状态
一般来讲,服务的启动有两个阶段,一个是开机的时候设置要不要启动这个服务,以及现在要不要启动这个服务。
其语法:
systemctl [command] [unit]
command
主要有:
start
:立刻启动后面紧接的unit
stop
:立刻关闭后面紧接的unit
restart
:立刻重启后面紧接的unit
,即先stop
后start
reload
:不关闭后面紧接的unit
的情况下,重新加载配置文件,让配置生效enable
:设置下次开机时,后面的unit
也被启动disable
:设置下次开机时,后面的unit
不会被启动status
:输出目前后面紧接的unit
的状态is-active
:目前有没有正在执行中is-enable
:开机时有没有默认要启动该unit
使用 status
时,会输出以下信息:
其中重点在第二、三行:
Loaded
:表示开机的时候这个 unit
是否会自启动
enabled
:为开机启动disabled
:开机不启动static
:开机不启动,不过可以被其它开机启动的服务唤醒mask
:无论如何开机都不启动
Active
:表示这个 unit
的状态:
active(running)
:正有一个或多个进程正在系统中运行active(exited)
:仅执行一次就正常结束的服务,目前并没有任何进程在系统中执行active(waiting)
:正在运行中,不过还需要等待其它的时间发生才能继续进行inactive
:这个服务目前没有进行
一般来说,不应该使用
kill
的方式来关闭一个正常地服务,因为使用kill
的方式关闭服务的时候,systemctl
会无法继续监控该服务
2.2 通过 systemctl
查看系统上所有的服务
查看系统上有多少服务存在,就需要使用 list-untis
及 list-unit-files
来查看,语法如下:
systemctl [command] [--type=TYPE] [--all]
其中 command
有:
list-units
:依据unit
显示目前有启动的unit
,若加上--all
才会列出没有启动的list-units-files
:依据/usr/lin/system/
内的文件,将所有文件列表说明
--type=TYPE
就是之前提到的 unit
类型,信息输出如下图:
其中:
UNIT
:项目的名称,后缀名为类型LOAD
:开机时是否被加载,ACTIVE
:目前的状态DESCRIPTION
:描述
2.3 通过 systemctl
管理不同的操作环境
通过上面的命令可以查询到与操作界面有关的 target
项目,在 CentOS 7.1 的默认情况下,有 26 个target unit,而跟操作界面相关性比较高的 target
主要有下面几个:
graphical.target
:命令加上图形界面multi-user.target
:纯命令行模式rescue.target
:在无法使用 root 登录的情况下,systemd
在启动是会多加一个额外的临时系统,与原本的系统无关emergency.target
:紧急处理系统的错误,在无法使用rescue.target
的时候,可以尝试该模式shutdown.target
:就是关机的模式getty.target
:可设置你需要几个tty
之类的操作
对于 target
的操作的语法如下:
systemctl [command] [unit.target]
其中 command
:
get-default
:取得目前的target
set-default
:设置后面接的target
成为默认的操作系统isolate
:切换到后面接的模式
2.4 通过 systemctl
分析各服务之间的依赖性
比方说 graphical.target
的启动会依赖到 multi-user.target
,那么如何追踪某个 unit
的依赖性。
systemctl list-dependencies [unit] [--reverse]
选项与参数:
--reverse
:反向追踪谁使用这个unit
的意思