Systemd是什么
Systemd 是 Linux 系统工具,用来启动守护进程,它的设计目的是:为系统的启动和管理提供一套完整的解决方案。
Unit
Systemd 可以管理所有的系统资源,不同的资源统称为 Unit(单位),一共分为12种。
包含:
- Service Unit 系统服务
- Target Unit 多个 unit 构成的一个组
- Socket Unit 进程间通信的 socket
…
service文件是什么
每一个 Unit 都有一个配置文件,告诉 Systemd 怎么启动这个 Unit。
Systemd 默认从目录/etc/systemd/system/
读取配置文件。但是里面存放的大部分文件都是符号链接,指向目录/usr/lib/systemd/system/
,真正的配置文件存放在那个目录。
配置文件的后缀名,就是该Unit的种类,.service
即系统服务的配置文件。如果省略,Systemd 默认后缀名为.service
。
配置文件格式
Unit
通常是配置文件的第一个区块,用来定义 Unit 的元数据,以及配置与其他 Unit 的关系。
主要字段:
- Description:简短描述
- Documentation:文档地址
- Requires:当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败(强依赖)
- Wants:与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败(弱依赖)
- Before:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动
- After:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动
Install
通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动。
主要字段:
- WantedBy:它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中
- RequiredBy:它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中
Service
用来设置 Service 的配置,只有 Service 类型的 Unit 才有这个区块。
主要字段:
- Type:定义启动时的进程行为
- ExecStart:启动当前服务的命令
- ExecStartPre:启动当前服务之前执行的命令
- ExecStartPost:启动当前服务之后执行的命令
- ExecReload:重启当前服务时执行的命令
- ExecStop:停止当前服务时执行的命令
- ExecStopPost:停止当其服务之后执行的命令
- RestartSec:自动重启当前服务间隔的秒数
- Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
完整字段清单可以参考官方文档
服务管理指令
列举一些服务管理的常用指令:
- Unit状态
# 显示系统状态
$ systemctl status
# 显示单个 Unit 的状态
$ sysystemctl status apache.service
- Unit管理
# 立即启动一个服务
$ sudo systemctl start apache.service
# 立即停止一个服务
$ sudo systemctl stop apache.service
# 重启一个服务
$ sudo systemctl restart apache.service
# 杀死一个服务的所有子进程
$ sudo systemctl kill apache.service
# 重新加载一个服务的配置文件
$ sudo systemctl reload apache.service
# 修改配置文件后重新加载,重新启动
$ sudo systemctl daemon-reload
$ sudo systemctl restart httpd.service
- 日志管理
# 实时滚动显示最新日志
$ sudo journalctl -f
# 实时滚动显示某个 Unit 的最新日志
$ sudo journalctl -u nginx.service -f
# 显示尾部的最新10行日志
$ sudo journalctl -n
......