美文网首页
systemd 进程管理

systemd 进程管理

作者: _于曼丽_ | 来源:发表于2022-03-04 07:27 被阅读0次

systemd 与 init 对比

CentOS 7 用 systemd 取代了 init,来管理系统的进程。

1. init 与 systemd

init 进程启动流程(串行启动):

  1. 系统调用 init 进程作为第一个进程,pid = 1
  2. init 进程读取 /etc/inittab 文件,确定 runlevel,假设 runlevel 为 3
  3. 按顺序调用 /etc/rc.d/rc3.d/ 目录中所有以 S 开头的软连接所指向的启动脚本
  4. 启动脚本中会调用位于 /usr/sbin/ 或者 /usr/bin/ 目录中的对应的二进制程序
  5. 启动二进制程序,会开启一个或多个进程

systemd 进程启动流程(并行启动):

  1. 系统调用 systemd 进程作为第一个进程,pid = 1
  2. systemd 进程查看 /etc/systemd/system/default.target 软连接所指向的 target,假设为 multi-user.target
  3. 读取 /etc/systemd/system/multi-user.target.wants/ 目录中所有软连接所指向的配置文件
  4. 如果该 unit 是 service 类型的,根据配置文件中的 [Service] 区块中的 ExecStart 选项启动对应的二进制程序
  5. 启动二进制程序,会开启一个或多个进程

2. RunLevel 与 Target

RunLevel 与 Target 的对应关系如下:

Traditional runlevel      New target name     Symbolically linked to...
Runlevel 0           |    runlevel0.target -> poweroff.target
Runlevel 1           |    runlevel1.target -> rescue.target
Runlevel 2           |    runlevel2.target -> multi-user.target
Runlevel 3           |    runlevel3.target -> multi-user.target
Runlevel 4           |    runlevel4.target -> multi-user.target
Runlevel 5           |    runlevel5.target -> graphical.target
Runlevel 6           |    runlevel6.target -> reboot.target
  • /etc/inittab :以前根据该文件中的 id:3:initdefault 决定是 3 级别还是 5 级别。
  • /etc/systemd/system/default.target:现在通过该链接指向的 Target 来决定是 multi-user.target 还是 graphical.target

现在也可以通过 systemctl set-default 命令设置 default.target 的指向。

# 设置开机启动级别为 3
systemctl set-default multi-user.target
# 设置开机启动级别为 5
systemctl set-default graphical.target
# 查看开机启动级别
systemctl get-default

3. 启动脚本与配置文件

以前是通过启动脚本来调用对应的二进制程序,现在是根据配置文件中 [Service] 块中的 ExecStart 选项来调用对应的二进制程序。

  • RunLevel 3 <=> multi-user.target
  • /etc/inittab <=> /etc/systemd/system/default.target
  • /etc/rc.d/ <=> /etc/systemd/system/
  • /etc/rc.d/rc3.d/ <=> /etc/systemd/system/multi-user.target.wants/
  • 启动脚本 <=> 配置文件
  • /etc/rc.d/init.d/ <=> /usr/lib/systemd/system/
  • /etc/rc.d/init.d/sshd <=> /usr/lib/systemd/system/sshd.service

Unit

Systemd 可以管理所有系统资源。不同的资源统称为 Unit(单位)。

Unit 一共分成12种类型:

  • Service unit:系统服务
  • Target unit:多个 Unit 构成的一个组
  • Device Unit:硬件设备
  • Mount Unit:文件系统的挂载点
  • Automount Unit:自动挂载点
  • Path Unit:文件或路径
  • Scope Unit:不是由 Systemd 启动的外部进程
  • Slice Unit:进程组
  • Snapshot Unit:Systemd 快照,可以切回某个快照
  • Socket Unit:进程间通信的 socket
  • Swap Unit:swap 文件
  • Timer Unit:定时器

我们最常使用的是 service 类型。

配置文件

每个 Unit 都有一个配置文件,告诉 Systemd 怎么启动这 Unit。配置文件的后缀名,代表着 Unit 类型,比如 sshd.socket。如果省略,Systemd 的默认后缀名为 service,所以 sshd 会被理解成 sshd.service

  • /etc/systemd/system/:Systemd 默认从该目录下读取配置文件。
  • /usr/lib/systemd/system/ :所有 Unit 的配置文件真正存放的位置。

systemctl enable 命令用于在上面两个目录之间,建立符号链接关系。
systemctl disable 命令用于在两个目录之间,撤销符号链接关系。

配置文件的状态

每个配置文件有四种状态:

  • enabled:已建立启动链接
  • disabled:没建立启动链接
  • static:该配置文件没有[Install]部分(无法执行),只能作为其他配置文件的依赖
  • masked:该配置文件被禁止建立启动链接

注意配置文件的状态和 Unit 的状态是两个概念,Unit 的状态包含了配置文件的状态和其他状态,从配置文件的状态无法看出该 Unit 是否正在运行。

systemctl status httpd.service 显示单个 Unit 的状态
systemctl list-unit-files | grep httpd.service 显示配置文件的状态

一旦修改配置文件,就要让 SystemD 重新加载配置文件,然后重新启动该配置文件对应的 Unit,否则修改不会生效。

systemctl daemon-reload
systemctl restart httpd.service

配置文件的内容

systemctl cat 命令可以查看配置文件的内容

$ systemctl cat atd.service

[Unit]
Description=ATD daemon

[Service]
Type=forking
ExecStart=/usr/bin/atd

[Install]
WantedBy=multi-user.target

配置文件分成几个区块,每个区块由区块名和键值对组成,区块名和键值对都区分大小写,键值对 = 两边不能有空格。

[Service]
ExecStart: 执行 systemctl start 命令时候,调用的二进制程序

[Install]
WantedBy:表示该服务所在的 Target,也就是定义在哪个级别需要开机启动

详细参考

常用命令

# 查看当前系统的所有 Unit
systemctl list-units
# 查看当前系统的所有类型为 service 的 Unit
systemctl list-units --type=service
# 查看所有 Unit 的配置文件
systemctl list-unit-files
# 查看所有类型为 service 的 Unit 的配置文件
systemctl list-unit-files --type=service
# 显示某个 unit 的状态
systemctl status httpd.service
# 显示某个 unit 是否正在运行
systemctl is-active httpd.service
# 显示某个 unit 是否开机启动
systemctl is-enabled httpd.service
# 开机启动
systemctl enable httpd.service
# 取消开机启动
systemctl disable httpd.service
# 启动服务
systemctl start httpd.service
# 停止服务
systemctl stop httpd.service
# 杀死服务的所有进程
systemctl kill httpd.service
# 重启服务
systemctl restart httpd.service
# 查看配置文件的内容
systemctl cat httpd.service
# 重新加载所有修改过的配置文件
systemctl daemon-reload
# 查看开机启动级别
systemctl get-default
# 设置开机启动级别为 3,重启之后生效
systemctl set-default multi-user.target
# 设置开机启动级别为 5
systemctl set-default graphical.target
# 立即进入 3 级别,立即生效,不需要重启
systemctl isolate multi-user.target
# 立即进入 5 级别
systemctl isolate graphical.target

相关文章

网友评论

      本文标题:systemd 进程管理

      本文链接:https://www.haomeiwen.com/subject/mklurrtx.html