Linux 温习(四): Systemd 分析与应用
- 陈大剩
- 2023-02-03 09:36:53
- 1105
进程
一个运行起来的程序被为 进程,进程的英语是 process
特殊的进程
这些进程不与任何终端关联,并且无论用户的身份如何,都在后台运行。这些进程的父进程是 PID(进程号)为 1 的进程,PID 为 1 的进程只在系统关闭时才会被销毁,这些进程会在后台一直运行。
守护进程
在 Unix / Linux 的世界中,我们将这类进程称之为 daemon (守护进程),daemon 是古希腊神话中的半神半人精灵、守护神的意思。守护进程也被称为service(服务),服务器软件大多都是以守护进程的形式运行的。
守护进程的名字通常会在最后有一个 d,表示 daemon,例如:systemd , httpd , smbd,等等
Windows 中的服务
在 Windows 的世界中,这样的进程也被称为service(服务)
Linux 操作系统启动的开机过程
新旧初始化进程服务
- 旧版:System V
- 新版:Systemd
新旧服务对比
systemd 命令 | System V 命令 | 作用 |
---|---|---|
systemctl start toto | service toto start | 启动服务 |
systemctl stop toto | service toto stop | 停止服务 |
systemctl restart toto | service toto restart | 重启服务 |
systemctl status toto | service toto status | 查看服务状态 |
systemctl reload toto | service toto reload | 重载配置文件(不停止服务) |
systemctl enable toto | chkconfig toto on | 开机自动启动服务 |
systemctl disable toto | chkconfig toto off | 开机不自动启动服务 |
systemctl is-enabled toto | chkconfig toto | 查看服务是否开机自动启动 |
systemctl list-unit-files –type=service | chkconfig –list | 查看各个级别下服务的启动和禁用情况 |
用systemd管理系统服务
Systemd 是几乎所有最新的 Linux 发行版采用的初始化系统,Systemd 的 PID(进程号)是 1,其他进程都是它的子进程,Systemd并不是一个命令,它包含了一组命令,Systemd 是基于事件的,Systemd 可以使进程并行启动。System V 是串行启动进程的,只有前一个进程启动完,才会启动下一个进程。Systemd 甚至可以重新启动因错误而停止的进程管理任务的计划,系统日志,外设,等。
管理进程的启动和停止
Systemd 提供了 systemctl
命令,使得我们可以管理 unit(单元),对 Systemd 来说,unit 泛指它可以操作的任何对象,unit 可以有不同的类型:服务,挂载,外设,等等,守护进程属于 service(服务)类型。
- 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:定时器
# 列出所有的活动单元
> systemctl
# 列出所有的服务是 service 的运行单元
> systemctl list-units --type=service
# 列出所有的服务文件
> ls /usr/lib/systemd/system
# 显示服务的文件内容
> systemctl cat nginx
# 编辑服务文件(生产副本)
> systemctl edit nginx
# 编辑服务文件(编辑源文件)
> systemctl edit --full nginx
# 重载文件
> systemctl daemon-reload
使用 target , System V 的运行级别的演进
使用 target (目标)
- System V使用 Run Level(运行级别)来管理不同的进
- systemd 用 target 来替换了 System V 的运行级别
- target 是指“目标”,简单来说是多个 unit 构成的一个组
systemd 的 target 名称 | System V运行级别 | 作用 |
---|---|---|
poweroff.target | 0 | 关机 |
rescue.target | 1 | 单用户模式 |
multi-user.target | 2 | 等同于级别3 |
multi-user.target | 3 | 多用户的命令行界面 |
multi-user.target | 4 | 等同于级别 3 |
graphical.target | 5 | 多用户的图形界面 |
reboot.target | 6 | 重启 |
emergency.target | emergency | 紧急 Shell |
Systemd 可以存在多个活动的 target,例如 swap.target,对应于可以被激活或不能被激活的系统功能,例如:graphical.target 对应于其他 target 的依赖。
# 列出所有 target
> systemctl list-units --type=target --all
# 列出 rescue.target 依赖关系
> systemctl list-dependencies rescue.target
# 列出默认的 target
> systemctl get-default
# 切换其他 rescue.target(单用户) 模式
> systemctl isolate rescue.target
# 设置默认的 target
> systemctl set-defalut rescue.target
使用 journalctl 命令管理日志
默认地,journalctl 按时间顺序显示由systemd管理的所有日志
# 按时间顺序显示所有日志
> journalctl
# 显示自上次启动以来所有的日志
> journalctl -b
# 显示自上次启动以来内核日志
> journalctl -b -k
# 查看 nginx 日志
> journalctl -u nginx
使用 systemd-analyze 命令查看启动耗时
# 启动总耗时
> systemd-analyze
# 每个 unit 总耗时
> systemd-analyze blame
# 禁止服务启动(手动启动也无效)
> systemctl mask nginx
# 解除禁止服务启动
> systemctl unmask nginx
请慎用 mask 这个子命令,因为它是一个增强版本的 disable,会阻止了所有激活这个 unit 的行为,包括启用和手动激活。 mask是英语“掩盖,遮蔽”的意思。
手动配置
总结
- systemd 管理 unit(单元),unit 可以有不同类型
- unit 的管理由 systemctl 命令完成
- systemd 的target取代了System V的运行级别
- 可以通过 journalctl 命令来管理系统日志
- 可以通过systemd-analyze命令来查看启动耗时